Links in Array zeitverzögert anklicken
Hal
- javascript
0 JürgenB0 Hal
1 Der Martin0 Hal0 Der Martin0 dave
0 MudGuard
Ich möchte in einem Array aus Links jeden Link zeitverzögert anklicken, sprich: die click()-Funktion ausführen.
So sieht das ungefähr aus:
var allLinks = document.getElementsByTagName("a");
for (i = 0; i < allLinks.length; i++) {
//Anklicken
}
An der Stelle von Anklicken habe ich diverse Codes probiert, aber keiner funzt. Ursprünglich hatte ich mal:
setTimeout("allLinksEmail[" + i + "].click()", 5000 * i);
Aber irgendwann hörte dieser Code unerklärlicherweise auf zu funktionieren (allLinksEmail ist not defined).
Hab's mit einer anonymen Funktion und auch mit einer extra Variable (linkClick = allLinksEmail[i]; etc.) versucht, aber nichts bringt das gewünschte Ergebnis.
Help anyone?
Hallo Hal,
hast du schon mal darüber nachgedacht, was passiert wenn jemand, z.B. dein Script, auf einen Link klickt?
Gruß, Jürgen
Hallo Hal,
hast du schon mal darüber nachgedacht, was passiert wenn jemand, z.B. dein Script, auf einen Link klickt?
Gruß, Jürgen
Klar hab ich das. Habe es ja schließlich probiert. Wenn ich drauf klicke, wird eine Javscript-Routine ausgeführt. Und genau das sollte auch mein Script tun.
Hallo,
Ich möchte in einem Array aus Links jeden Link zeitverzögert anklicken, sprich: die click()-Funktion ausführen.
ist dir klar, dass -wenn das funktioniert- damit eine neue Seite geladen wird und dein Script sozusagen in vollem Galopp erlegt wird?
var allLinks = document.getElementsByTagName("a");
Das ist unnötig kompliziert; dein Browser stellt mit document.links bereits eine Collection der im Dokument vorkommenden Links zur Verfügung.
for (i = 0; i < allLinks.length; i++) {
//Anklicken
}
>
> An der Stelle von Anklicken habe ich diverse Codes probiert, aber keiner funzt.
Probieren ist auch nicht unbedingt eine zielführende Strategie.
> `setTimeout("allLinksEmail[" + i + "].click()", 5000 * i);`{:.language-javascript}
Das ist aber nicht schön. Zwar kann setTimeout() auch mit einem String umgehen, eigentlich sollte man ihm aber eine Funktion bzw. eine Funktionsreferenz geben:
`setTimeout(function(){ document.links[i].click(); }, 5000 * i);`{:.language-javascript}
> Aber irgendwann hörte dieser Code unerklärlicherweise auf zu funktionieren (allLinksEmail ist not defined).
Na klar, nämlich sobald der Browser den ersten simulierten Klick bearbeitet und als Reaktion ein neues Dokument lädt. Was erwartest du sonst?
Noch viel interessanter finde ich aber die Frage: Was willst du damit eigentlich erreichen?
So long,
Martin
--
Ungeschehene Ereignisse können einen katastrophalen Mangel an Folgen nach sich ziehen.
(Unbekannter Politiker)
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
setTimeout("allLinksEmail[" + i + "].click()", 5000 * i);
Das ist aber nicht schön.
Ich weiß. Hat aber erst funktioniert und sollte auch funktionieren. Jetzt tut es das nicht mehr. Keine Ahnung, warum.
Zwar kann setTimeout() auch mit einem String umgehen, eigentlich sollte man ihm aber eine >Funktion bzw. eine Funktionsreferenz geben:
setTimeout(function(){ document.links[i].click(); }, 5000 * i);
Das Array wird nochmal gefiltert, sprich nicht jeder Link wird angeklickt, sondern nur welche mit einem bestimmten title Attribut. Den Teil des Codes habe ich aber nicht ausgeführt, der funktioniert auch. allLinks enthält also nur noch die betreffenden Links.
Das hier:
setTimeout(function(){ allLinks[i].click(); }, 5000 * i);
habe ich schon probiert. Gibt mir die Meldung 'Cannot convert allLinks[i]' to Object.'
Aber irgendwann hörte dieser Code unerklärlicherweise auf zu funktionieren (allLinksEmail ist not defined).
Na klar, nämlich sobald der Browser den ersten simulierten Klick bearbeitet und als Reaktion ein neues Dokument lädt. Was erwartest du sonst?
Nein, es wird kein neues Dokument geladen. href ist gar nicht definiert. Es soll das onclick-Ereignis des betreffenden Links ausgelöst und die entsprechende Routine gestartet werden. Das Dokument bleibt dabei erhalten.
Das ganze ist eine Opera Extension, allerdings für den privaten Gebrauch lediglich. Nichts zum Veröffentlichen.
Daher kann ich auch die onclick-Routine nicht per Hand ausführen, da das Skript auf fremden Seiten läuft.
Noch viel interessanter finde ich aber die Frage: Was willst du damit eigentlich erreichen?
S.o.
Hi,
setTimeout(function(){ allLinks[i].click(); }, 5000 * i);
habe ich schon probiert. Gibt mir die Meldung 'Cannot convert allLinks[i]' to Object.'
dann enthält allLinks aber offensichtlich doch nicht das, was du erwartest. Denn nach deiner Beschreibung sollte es ja eine Collection von HTML-Elementobjekten sein - nämlich die aller a-Elemente, die eine bestimmte Zusatzbedingung erfüllen.
Die Fehlermeldung ist ein deutliches Indiz dafür, dass dem in Wirklichkeit nicht so ist.
Wird allLinks vielleicht im Verlauf des Scripts doch noch ungewollt manipuliert oder überschrieben?
Nein, es wird kein neues Dokument geladen. href ist gar nicht definiert. Es soll das onclick-Ereignis des betreffenden Links ausgelöst und die entsprechende Routine gestartet werden. Das Dokument bleibt dabei erhalten.
Das ganze ist eine Opera Extension, allerdings für den privaten Gebrauch lediglich. Nichts zum Veröffentlichen.
Das ist eine wichtige Zusatzinformation, die du eigentlich schon im Startposting hättest geben sollen.
Daher kann ich auch die onclick-Routine nicht per Hand ausführen, da das Skript auf fremden Seiten läuft.
Hm. Dann bin ich mangels Detailwissen raus aus der Sache.
Ciao,
Martin
Hi,
setTimeout(function(){ allLinks[i].click(); }, 5000 * i);
habe ich schon probiert. Gibt mir die Meldung 'Cannot convert allLinks[i]' to Object.'dann enthält allLinks aber offensichtlich doch nicht das, was du erwartest. Denn nach deiner Beschreibung sollte es ja eine Collection von HTML-Elementobjekten sein - nämlich die aller a-Elemente, die eine bestimmte Zusatzbedingung erfüllen.
Die Fehlermeldung ist ein deutliches Indiz dafür, dass dem in Wirklichkeit nicht so ist.Wird allLinks vielleicht im Verlauf des Scripts doch noch ungewollt manipuliert oder überschrieben?
Die variable "i" enthält zum Zeitpunkt zu dem dieser Code ausgeführt wird nicht mehr das, was _du_ erwartest (nämlich allLinks.length, und allLinks[allLinks.length] ist undefined).
Richtig wäre wenn dann folgendes:
setTimeout((function(i){ return function(){ allLinks[i].click(); }; }(i)), 5000 * i);
Das hat aber rein gar nichts mit dem ursprünglichem Problem zu tun.
~dave
Hi,
var allLinks = document.getElementsByTagName("a");
setTimeout("allLinksEmail[" + i + "].click()", 5000 * i);
Daß allLinks und allLinksEmail unterschiedliche Dinge sind, ist Dir noch nicht aufgefallen?
cu,
Andreas