2009-10-15 12 views
0

Essayez de lancer le code ci-dessous:Mootools étrange conflit bug avec jQuery

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<script> b = jQuery.noConflict(true); </script> 

<script src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.3/mootools-yui-compressed.js"></script> 
<script> 
    (function($){ 
    $.a = function(){ 
     var x = []; 
     for (l in x){ 
     console.log(l); 
     } 
    }; 
    })(b); 

    b.a(); 
</script> 

Même si x est vide, en console.log vous verrez des valeurs. Pourquoi cela arrive-t-il? Suis à la fin de mon esprit.

Quelqu'un peut-il suggérer comment résoudre ce problème.

Répondre

3

MooTools fortementextends le Array.prototype, et vous itérer votre tableau avec une déclaration for...in.

Cette déclaration est faite pour parcourir les propriétés d'un objet. Pour les tableaux, une boucle for ou while est recommandée.

Pourquoi? car l'instruction for...in explore la chaîne du prototype comme vous l'avez remarqué, car l'ordre d'itération est arbitraire, l'itération sur un tableau peut ne pas visiter les éléments dans l'ordre numérique. Toutefois, si vous souhaitez toujours répéter cette instruction, vous pouvez effectuer une vérification à l'intérieur de la boucle pour vous assurer que les propriétés que vous allez itérer sont présentes directement sur l'objet, et non quelque part sur la chaîne du prototype, en utilisant le hasOwnProperty fonction:

var x = []; 
for (l in x){ 
    if (x.hasOwnProperty(l)) { 
    console.log(l); 
    } 
} 
+0

maintenant c'est un vrai mal de tête, parce que j'utilise des centaines de boucles. –

+0

okay fait cela. quoi d'autre mootools étendre? C'est tellement ennuyeux parce que j'utilise jQuery en mode noConflict. Comment puis-je contrôler mootools? –

+1

Mootools étend beaucoup de choses, mais généralement cela n'a pas d'importance. Vous devriez être très méfiant à propos de 'for ... in', que vous utilisiez mootools ou non. Certainement pour l'itération du tableau, vous devriez toujours respecter la boucle 'for (var i = 0; i bobince