Invalid argument ou appel de procédure IE problème lors d'une itération dans le document.les feuilles de style en utilisant $.chacun()
J'ai écrit ce code qui effectue une itération sur toutes les feuille de style globale règles et les stocke dans un tableau/objet. J'utilise ce dictionnaire comme objet ultérieurement de modifier les règles globales plutôt que de fixer les styles sur les différents éléments.
Code suivant pauses dans IE8 mais qui fonctionne bien dans Firefox3.7 et Chrome4.
var allRules;
$(function() {
var fileRules;
allRules = [];
$.each(document.styleSheets, function() {
//get rules for any browser (IE uses rules array)
fileRules = this.cssRules || this.rules;
$.each(fileRules, function() {
allRules[this.selectorText] = this;
});
});
});
- Je obtenir Invalid procedure call or argument
erreur. Quand j'essaie de le corriger, ce code avec succès parcourt deux feuilles de style CSS fichiers avec des règles, mais lorsque la seconde de l'itération est fait, il échoue.
Je n'arrive pas à trouver une erreur dans ce code.
Puisque vous ne l'utilisez pas
Bas: je l'ai essayé aussi, mais il ne fonctionne pas non plus.
Désolé, j'aurais dit qu'il ne serait pas résoudre quoi que ce soit. C'était juste un aparté.
allRules
comme un tableau, vous devez le déclarer comme un objet: allRules = {};
Bas: je l'ai essayé aussi, mais il ne fonctionne pas non plus.
Désolé, j'aurais dit qu'il ne serait pas résoudre quoi que ce soit. C'était juste un aparté.
OriginalL'auteur Robert Koritnik | 2010-02-18
Vous devez vous connecter pour publier un commentaire.
Le problème
Après des tests approfondis, j'ai découvert que
document.styleSheets
n'est pas un réseau régulier dans IE. C'est pourquoi il se casse en$.each()
appel lorsqu'il atteint la fin.Si nous prenons un coup d'oeil à la fonction jQuery lui-même, il a un
for
boucle d'itération sur un objet qui a unelength
propriété, faussement croire qu'il est un tableau.document.styleSheets
n'ontlength
bien, mais ce n'est évidemment pas un tableau. Alors, quand cettefor
boucle dans$.each()
est exécutée:il échoue après le dernier élément a été itéré. Comme nous pouvons le voir ce
for
boucle n'a pas d'incrémenti
sur son propre, mais plutôt l'incrémente, tout en affectant une nouvelle valeur àvalue
.On peut vérifier cela à la main. Écrire ces deux lignes dans toute barre d'adresse du navigateur:
Le premier s'exécute correctement dans tous les navigateurs, mais le second ne parvient pas dans IE.
La solution
Nous devons réécrire l'itération sur les feuilles de style
J'ai pensé qu'il pourrait être utile à quelqu'un d'autre, si bien que je documentée de manière plus approfondie. Merci pour le upvote.
OriginalL'auteur Robert Koritnik
Pourrait-il que l'analyse de la règle elle-même est défectueux? Essayez d'expérimenter avec différentes feuilles de style et de réorganiser les règles pour s'assurer qu'il n'y a pas un problème de l'analyse de la règle pour une raison quelconque.
OriginalL'auteur Dave Swersky
code est vrai:
(jQuery)
à$.each
... Pourquoi avez-vous l'ajouter à la première place? Vous avez probablement voulu faire la fonction principale est immédiatement exécutable. Mais même si... Alors ce code doit s'exécuter la dernière dans le document. En utilisant une solution de l'approche par l'exécution de ce document à portée de main est beaucoup plus transparent. Tu ne crois pas?Ne pas mentionner le fait que vous avez fait
allRules
une fermeture variable, de sorte que vous ne serez pas en mesure d'accéder à ces règles que vous avez lu dans...OriginalL'auteur popo