Firefox: wie umgehe ich NS_BINDING_ABORT?
LX
- javascript
Hallo, alle miteinander!
Ich habe folgendes Problem: ich soll für einen Test bestimmte click-Events an ein Statistik-Tool schicken. Das mache ich aus mehreren offensichtlichen Gründen über einen Image()-Request (also "(new Image()).src=...").
Allerdings habe ich das Problem, dass Firefox beim Ausführen eines Links diese Requests mit dem Fehler NS_BINDING_ABORT abbricht, der immer dann auftritt, wenn das jeweilige DOM, innerhalb dessen der Request stattfindet, verworfen wird. Ich habe schon versucht, die Link-Ausführung zumindest zeitweise zu unterbinden (mittels preventDefault und return false im DOM-Event). Dabei möchte ich jedoch den Timeout nicht zu groß werden lassen.
Hat sonst noch jemand eine Idee, wie ich das Problem geschickt umgehen könnte?
Gruß, LX
Allerdings habe ich das Problem, dass Firefox beim Ausführen eines Links diese Requests mit dem Fehler NS_BINDING_ABORT abbricht, der immer dann auftritt, wenn das jeweilige DOM, innerhalb dessen der Request stattfindet, verworfen wird.
Was meinst du mit: das DOM wird verworfen?
Und wieso Link, du sprichst doch oben von einem Image Element?
Struppi.
Mit "Link" ist die URL im src-Attribut des Images gemeint. Ausführen eines Links bedeutet in diesem Fall das Absetzen eines Requests an den Server.
Wenn ich sage, das "DOM wird verworfen", meine ich damit den Vorgang, der stattfindet, wenn eine Seite beim Verlassen abgeschlossen wird, mit unload-Events etc.
Gruß, LX
Mit "Link" ist die URL im src-Attribut des Images gemeint. Ausführen eines Links bedeutet in diesem Fall das Absetzen eines Requests an den Server.
Ok, also kein Link, sondern ein Request.
Wenn ich sage, das "DOM wird verworfen", meine ich damit den Vorgang, der stattfindet, wenn eine Seite beim Verlassen abgeschlossen wird, mit unload-Events etc.
Warum sagst du uns nicht genauer was du machst, das klingt jetzt ganz geheimnisvoll, läßt sich aber schwer nachvollziehen.
Ich kann mit der Formulierung "eine Seite beim verlassen abgeschlossen" wenig anfangen.
Der Fehler wird ja geworfen, wenn du ein Request abgebrochen wird. Also muss es irgendwo eine Stelle geben, wo der Request zu einem falschen Zeitpunkt abgebrochen wird. Ich nehme an bei "unload-events etc."
Struppi.
Ich setze beim document.onclick-Event wie bereits gesagt ein Image-Request ab, dank Capture-Event vor einem onclick-Handler auf einem darinnen liegenden Link. Wenn nun ein geklickter Link (a-Tag) oder ein darauf liegendes onclick-Event, welches auf location.href zugreift, zu schnell "feuert", verliere ich dabei das Image-Request.
Da die entsprechende Test-Seite ein wenig groß ist, werde ich mal versuchen, einen kleineren Testfall zu bauen, mit dem man das besser nachvollziehen kann.
Gruß, LX
Ich setze beim document.onclick-Event wie bereits gesagt ein Image-Request ab, dank Capture-Event vor einem onclick-Handler auf einem darinnen liegenden Link. Wenn nun ein geklickter Link (a-Tag) oder ein darauf liegendes onclick-Event, welches auf location.href zugreift, zu schnell "feuert", verliere ich dabei das Image-Request.
Danke, das ist verständlicher.
Kann es sein, dass du httpfox installiert hast? Da ich diese Meldung nicht erhalte, auch wenn der Request abgebrochen wird und ich im Netz Hinweise finde, dass die Meldung von dem AddOn kommmt.
Struppi.
Die Meldung stammt tatsächlich von dem Addon, deutet aber darauf hin, dass ein Request nicht fertig ausgeführt werden kann und somit verloren geht.
Hier ein Testcase:
http://jquery.it-rfc.de/ns_binding_abort.html
Vorher httpfox installieren und cache löschen.
Gruß, LX
Die Meldung stammt tatsächlich von dem Addon, deutet aber darauf hin, dass ein Request nicht fertig ausgeführt werden kann und somit verloren geht.
Stimmt ja auch.
Hier ein Testcase:
http://jquery.it-rfc.de/ns_binding_abort.html
Ok, ich hab bei Tests festgestellt, dass der image Request bei mir ankommt.
Was mich aber wundert ist, warum machst du das location.href? Wenn du auf den Link klickst ist es logisch, dass die Zuweisung abgebrochen werden muss, da du ja nicht zwei Seiten in einem Fenster laden kannst. Was bezweckst du denn damit?
Struppi.
Das Ziel ist, eine Statistik auf einem anderen Server mit Daten über die Seitennutzung zu befüllen. Und location.href nutze ich hier nur zur Demonstration.
Gruß, LX
Das Ziel ist, eine Statistik auf einem anderen Server mit Daten über die Seitennutzung zu befüllen. Und location.href nutze ich hier nur zur Demonstration.
Das ist das Ziel. Aber wozu dient das location.href? Damit rufst du im aktuellen Fenster ein neues Dokument auf, das willst du aber nicht, oder doch? Dann musst du natürlich das Linkziel verhindern mit return false
Struppi.
Das location.href dient in diesem Fall zur Simulation eines Klicks auf einen Link, der hier statistisch erfasst werden soll, mit dem Ziel, zu zeigen, wann das Problem auftritt.
Mein derzeitiger Workaround besteht darin, location.href verzögert zu setzen, wobei die Verzögerung trotzdem ein gewisses Problem darstellt, denn wird sie zu groß, fühlt sich die Seite zu langsam an, wird sie zu klein, können zu viele Events verloren gehen.
Ich hatte gehofft, dass es eine elegantere Lösung geben würde - das ist jedoch vermutlich leider nicht der Fall.
Gruß, LX
Das location.href dient in diesem Fall zur Simulation eines Klicks auf einen Link, der hier statistisch erfasst werden soll, mit dem Ziel, zu zeigen, wann das Problem auftritt.
Wie gesagt das location.href dient hier dazu, eine neue Seite aufzurufen. Wenn dass nicht das ist, was du willst, musst du das Linkziel einfach an ein neues Fenster leiten.
Struppi.
Das ist aber genau das, was ich will - allerdings soll vorher noch der Statistik-Request zuverlässig abgesetzt werden.
Gruß, LX
Das ist aber genau das, was ich will - allerdings soll vorher noch der Statistik-Request zuverlässig abgesetzt werden.
Was willst du? In einem Fenster zwei Seiten gleichzeitig laden? Das geht nicht!
Was ich nicht verstehe, warum du nicht den Request mit auch mit einem Image Objekt absetzt?
Struppi.
Nein, ich will durchaus nicht zwei Seiten gleichzeitig laden, sondern eine Statistik-Information per Image-Request an einen Server schicken und zeitgleich eine andere Seite öffnen. Die Antwort des Image-Requests ist mir dabei eigentlich ziemlich schnuppe - der Request muss nur zuverlässig zum Statistik-Server kommen und genau da hakt es beim Firefox!
Gruß, LX
Warum ist denn der Statistik-Request nicht auf der Seite, die geladen (und doch damit erfasst) werden soll?
Weil diese Seiten teilweise extern sind und ich damit keine Möglichkeit mehr habe, meine Nutzer dort zu tracken.
Übrigens habe ich inzwischen eine (wenn auch wenig elegante) Lösung gefunden, die auch den Seitenwechsel über location.href innerhalb des click-Events einbezieht: wenn man im Firefox das unbeforeunload-Event so lange verzögert, bis die complete-Eigenschaft, des Image-Objekts true ist, funktioniert alles.
Gruß, LX
Übrigens habe ich inzwischen eine (wenn auch wenig elegante) Lösung gefunden, die auch den Seitenwechsel über location.href innerhalb des click-Events einbezieht: wenn man im Firefox das unbeforeunload-Event so lange verzögert, bis die complete-Eigenschaft, des Image-Objekts true ist, funktioniert alles.
Wie gesagt, bei mir funktioniert das auch ohne Verzögerung - ich hatte dazu den onunload Event ausprobiert.
Struppi.
Nein, ich will durchaus nicht zwei Seiten gleichzeitig laden, sondern eine Statistik-Information per Image-Request an einen Server schicken und zeitgleich eine andere Seite öffnen. Die Antwort des Image-Requests ist mir dabei eigentlich ziemlich schnuppe - der Request muss nur zuverlässig zum Statistik-Server kommen und genau da hakt es beim Firefox!
Also bei meinen Test ging es tadellos, ich hab in dem Request Skript eine Pause von 2 Sekunden eingebaut und Firefox hat schön gewartet bis die Antwort kam. Du machst irgendetwas falsch. Der Weg mit location.href ist aber so oder so verkehrt.
Struppi.
Die Meldung stammt tatsächlich von dem Addon, deutet aber darauf hin, dass ein Request nicht fertig ausgeführt werden kann und somit verloren geht.
Hier ein Testcase:
http://jquery.it-rfc.de/ns_binding_abort.html
Ich hatte das Beispiel gestern falsch gesehen.
Weil du die ganze Zeit von irgendwelchen Events gesprochen hast (onunload, onclik u.ä.), das passiert hier in dem Beispiel ja gar nicht, oder hast du es geändert?
Ich habe hier nur die zwei aufeinanderfolgenden Request gesehen, das kann natürlich nicht klappen.
Ich hab mal ein Beispiel gebastelt, was ohne Timeout o.ä. auskommt, dort werden alle klicks geloggt.
Darüber hinaus, habe ich das Gefühl du antowrtest mir kurz angebunden und pampig.
Ich weiß zwar nicht was ich dir getan habe, dass das so ist, aber wenn du nicht möchtest, dass ich mich mit deinem Fragen auseinandersetze kannst du das gerne sagen.
Struppi.
Darüber hinaus, habe ich das Gefühl du antowrtest mir kurz angebunden und pampig.
Ich weiß zwar nicht was ich dir getan habe, dass das so ist, aber wenn du nicht möchtest, dass ich mich mit deinem Fragen auseinandersetze kannst du das gerne sagen.
Naja, scheint so. Ich werd' versuchen mir's zu merken.
Struppi.