• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[JavaScript] ajax-IE stürzt ab ohne Fehlermedlung

tho_mas

New member
Hallo an alle,

bin so langsam am verzweifeln. Habe ein Ajax-Script, welches auf einer Wordpress Seite die Inhalte Dynamisch lädt.
Das Problem: Das Script läuft im Firefox und Safari problemlos- im IE stürzt nach einer bestimmten Zeit der komplette Browser ab. Es kommt keine Fehlermeldung.

Seite: http://shagadelic-groove.de/wp/

Reproduktion des Absturz: Alle Menue Punkte einmal von vorn nach hinten anklicken. Und dann irgend einen anderen Menüpunkt anklicken... Dann sollte der IE komplett abstürzen.

link zu script:
http://shagadelic-groove.de/wp/wp-content/plugins/ajax-page-loader-15/ajax-page-loader.js

vielen dank schonmal und grüße
thomas
 
ich glaube dein ie hat eine Macke. Bei mir funktioniert Alles.
bei mir hängt er sich auf. ie6.
Code:
---------------------------
Microsoft Internet Explorer
---------------------------
Ein Skript auf dieser Seite verursacht eine Verzögerung in Internet Explorer. Falls das Skript weiter ausgeführt wird, verlängern sich die Antwortzeiten des Computers möglicherweise erheblich. 

Soll das Skript abgebrochen werden?
---------------------------
Ja   Nein   
---------------------------
also irgendeine lange schleife oder etwas in der art. immer wenn ein menüpunkt mehr als 1 mal angewählt wird. vielleicht irgendein ablauffehler in einer der vielen globalen variablen. ich sehe da nicht durch.
 
erstmal danke für die schnellen antworten. kann verstehen, dass bei dem script keiner durch sieht.
ich hab das script mal reduziert, auf die reine ajax loader sache. eine ursprünglich enthaltene while schleife konnte ich noch komplett erstetzen. der fehler tritt leider immer noch auf...

hat noch jemand eine idee? ich versteh das echt nicht, warum der browser dabei abstürzt.
was auch merkwürdig ist: auf meinem mac unter crossover läuft die seite in ie6 und ie7 problemlos...

kurze erklärung zum script: eigentlich ein ganz normaler ajax aufruf...
per jquery werden alle links "abgefangen" und die funktion loadPage wird aufgerufen. darin dann der GET request, wenn der fertig ist weiter zu showPage. request antwort wird noch etwas gekürzt und ins dom geladen.

hier das gekürzte script:

Code:
var $j = jQuery.noConflict();

$j(document).ready(pageLoaderInit);
function pageLoaderInit(){
  $j("a").click(function(event){
    if(this.href.indexOf(home)>=0&&this.href.indexOf('/wp-')<0){
      event.preventDefault();
      this.blur();
      var caption = this.title || this.name || "";
      var group = this.rel || false;
      loadPage(this.href);
    }
  });
}
function getHTTPObject() {
  var xmlhttp;
if (window.XMLHttpRequest) {
  // If IE7, Mozilla, Safari, and so on: Use native object.
  xmlhttp = new XMLHttpRequest();
}
else
{
  if (window.ActiveXObject) {
     // ...otherwise, use the ActiveX control for IE5.x and IE6.
     xmlhttp = new ActiveXObject('MSXML2.XMLHTTP.3.0');
  }
}
  return xmlhttp;
}
var isWorking = false;
var http = getHTTPObject();

function loadPage(url){
  if(!isWorking){
    scroll(0,0);
    document.getElementById('col1_content').innerHTML='<center><img src="'+loadingIMG.src+'" /></center>';
    http.open('GET',url,true);
    isWorking=true;
    http.onreadystatechange=showPage;
    http.send(null);
  }
}

function showPage(){
  if(http.readyState==4){
    if(http.status==200){
      isWorking=false;
      var content = http.responseText;
      var output='';
     
	      content = content.split('<div id="col1_content" class="clearfix">')[1];
	      content = content.split('<div id="col3">')[0];

	  output = content;
      
      document.getElementById('col1_content').innerHTML=output;
      pageLoaderInit();
    }else{
      alert(http.status);
    }
  }
}
 
Zuletzt bearbeitet:
also absturz heißt, es kommt die "skript meldung" (sofern man den ie so eingestellt hat...)

es laufen auf der seite noch einige andere skripts. wenn ich allerdings das besagte ajax script "abschalte", funktioniert die seite. deswegen war ich bisher davon ausgegangen, dass es auch an diesem script liegen müsste.

gibt es denn den fall, dass scripte für sich einzeln laufen, aber in kombination zu solchen fehlern führen?

dann ist das wohl der nächste punkt, den ich testen werde. mal alle anderen skripte aus schalten. und mit alerts den fehler weiter einkreisen...

grüße
thomas
 
wenn man sich mal die requests ansieht, stellt man fest, dass pausenlos requests gesendet werden.
also die schleife ist im ajax-page-loader.
dann fällt auf, daß du in pageLoaderInit den click-handler nach jedem request zuweist, also nach jedem request hast du einen handler mehr.
wenn jetzt nach dem 1. request (also mit 2 click-handler) der onreadystatechange-handler aus dem request des 1. clicks(die seite ist gecached) vor dem 2. click-handler in die abarbeitungsqueue eingereiht wird, hast du deine endlosrekursion.
das einzige, was mich wundert, im ff sehe ich immer nur einen request und nicht jedesmal einen mehr(oder bricht der ff seinen request auch ab, wenn das requestobjekt überschrieben wird? ich dachte immer, das macht nur der ie).
 
problem gelöst!
der entscheidende hinweis waren die erzeugten click-event handler.

ich habe nun einfach vor dem erneuten aufruf von pageLoaderInit() die alten click-handler gelöscht, mit der jQuery unbind() funktion...

$j("a").unbind('click');

vielen dank nochmal für die hilfe! ich glaube, da wäre ich nie von allein drauf gekommen. ist eben doch immer so ne sache, wenn man von anderen geschriebene javascript plugins einfach so verwendet.

grüße
thomas
 
ich habe nun einfach vor dem erneuten aufruf von pageLoaderInit() die alten click-handler gelöscht, mit der jQuery unbind() funktion...
das ist überflüssig.
du musst die click-event handler einfach nicht mehrfach zuweisen.
einmal zuweisen, fertig. diese ständig zu löschen um sie gleich darauf wieder mit identischen funktionen zu belegen ist nicht nötig.

EDIT: Bei der gelegenheit könnte man auch gleich mal nur die anker mit handlern versorgen, bei denen das auch gewollt ist. alle zu belegen und im handler zu filtern ist suboptimal.
 
Zuletzt bearbeitet:
dachte ich auch erst. aber die erneute zuweisung der event handler ist leider notwendig, da die inhalte der seite dynamisch sind (wordpress). wenn nun seiten inhalte geladen werden, die interne links enthalten, würde man diese nicht mit einem ajax request aufrufen können.

oder habe ich da eine möglichkeit übersehen?

die filterung dient eigentlich hauptsächlich nicht für links, sondern für den zugang zum backend. (unter http://seite.de/wp-admin)
ohne diese filterung komme ich da nicht mehr hin.

was ich nicht versteh ist, dass sich die anweisung doch eigentlich nur auf click-events auf einen link bezieht. warum hat das auch auswirkungen, wenn ich die adresse direkt im browser eingebe?
 
in der funktion, die bei einem click event ausgeführt wird, steht doch diese abfrage:

Code:
$j("a").click(function(event){ 
if(this.href.indexOf('/wp-')<0){
ajax aufruf
}
}

dadurch ist gewährleistet, dass links, die auf zum beispiel "seite.de/wp-admin" verweisen, nicht durch den ajax request gehen, sondern ganz normal aufgerufen werden.

mein frage war: der event handler wird doch eigentlich nur allen links zugewiesen ( $j("a").click() ). wenn ich aber nun die abfrage this.href.indexOf('/wp-')<0 rausnehme, kann ich selbst durch direkte eingabe der url in den browser nicht auf die seite "seite.de/wp-admin/index.php" zugreifen. ich komme immer wieder auf die startseite.

wie gesagt, ist nur eine verständnisfrage...
 
Zurück
Oben