[JS] Functie wordt dubbel aangeroepen in IE

Pagina: 1
Acties:

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 22:14
Om widgets te kunnen maken op pagina's als netvibes heb ik het volgende bedacht:

Op de pagina kun je dit neerzetten:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<script type="text/javascript" src="http://www.swis.nl/tribal/widget.class.js"></script>
<script type="text/javascript">
    
    oWidget = new widget();
    oWidget.load('http://www.nu.nl/deeplink_rss2/index.jsp?r=Algemeen'); 
    oWidget.call(parseXML);
    
    function parseXML(aContent){
                        
        var div = document.getElementById('test');
        
        var sContent = '';
        for (var i=0; i < aContent.length; i++){
            sContent += '<h1>' + aContent[i]['title'] + '</h1>' +  aContent[i]['description'] + '<hr />';
        }
         div.innerHTML = sContent;    
        
    }         
</script>


Via de externe javascript kun je dan cross domain een rss feed parsen.
Dit is de code die we op onze server zetten:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var __GLOBAL_XML_RESULT__;


function widget(){
    
    this.load = function(sUri){
    
        this.s = document.createElement('script'); 
        this.s.type = 'text/javascript'; 
        this.s.src = 'http://www.swis.nl/tribal/getxml.php?uri=' + sUri; 
        document.getElementsByTagName('head')[0].appendChild(this.s);   
        
        this.s.onload = attachEventHandler(this, 'getContent');
        this.s.onreadystatechange = attachEventHandler(this, 'getContent');    
    };
    
    this.call = function(oFunction){
        this.functionCall = oFunction;
    }
    
    this.getContent = function(){
        this.functionCall(__GLOBAL_XML_RESULT__);
    };
}


function attachEventHandler(oObject, sMethodName) { 
   return function () { 
      return oObject[sMethodName].apply(oObject, arguments); 
   }; 
} 


Het php scriptje zet de feed om naar een array en output deze met json_encode

Dat werkt allemaal prima in Firefox, IE geeft echter eerst een error, maar toont de feed daarna wel. In IE wordt de functie parseXML twee keer uitgevoerd; één keer zonder argumenten.

Komt dat door de reference die gegeven wordt in

JavaScript:
1
oWidget.call(parseXML); 


IE debuggen is niet zo fijn en ik zie niet waardoor de functie 2x aangeroepen kan worden.
Iemand een idee?

Verwijderd

Ik heb niet heel uitgebreid gekeken maar er zijn meerdere stadia in onreadystatechange. Die handler getContent wordt dus ook meerdere keren aangeroepen daarvoor. Een fix zou kunnen zijn om in de handler te checken of readyState == 4.

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 22:14
Ik geloof niet dat dat het probleem is; als ik met bijvoorbeeld this.called bijhoud of de functie aangeroepen is, wordt de functie alsnog 2x aangeroepen. Ook met een check op readystate == 4 wordt de functie dubbel aangeroepen. Het lijkt alsof het echt in de referentie zit.