Comment détecter HTMLCollection / NodeList en JavaScript?
Je ne suis pas sûr que mon actuel de la mise en œuvre est disponible tout le temps:
function isNodeList(nodes) {
var result = Object.prototype.toString.call(nodes);
//modern browser such as IE9 /firefox /chrome etc.
if (result === '[object HTMLCollection]' || result === '[object NodeList]') {
return true;
}
//ie 6/7/8
if (typeof(nodes) != 'object') {
return false;
}
//detect length and item
if (!('length' in nodes) || !('item' in nodes)) {
return false;
}
//use the trick NodeList(index),all browsers support
try {
if (nodes(0) === null || (nodes(0) && nodes(0).tagName)) return true;
}
catch (e) {
return false;
}
return false;
}
Une situation commune est {longueur:1,item type:function(){return [];}}
La valeur de résultat dans google chrome /safari /opera est '[objet NodeList]'.
Dans firefox et IE 9 , c'est - '[objet HTMLCollection]'.
Qui est la valeur standard?
source d'informationauteur simon xu
Vous devez vous connecter pour publier un commentaire.
Suivantes devraient retour truesi les nœuds est de type NodeList
Je structure le code différemment:
Notes:
"item"
n'est pas obligatoirement dans une nodeListhasOwnProperty()
au lieu dein
nodeType
au lieu detagName
comme les nœuds de texte ou des commentaires n'ont pas de nom&&
chaîne si vous voyez l'ajustementscript:
utiliser comme cette:
Voici comment faire pour tester si un objet est une NodeList dans les navigateurs modernes:
Vérifier si une variable est un HTMLcollection ou d'un élément du dom
Cette réponse est probablement vraiment vraiment en retard, mais....
J'ai créé un point de référence de toutes les réponses ici pour voir, quel est le meilleur approuver en vitesse. S'avère
NodeList.prototype.isPrototypeOf(nodes)
est de loin le plus rapide. Mais dans un cas d'utilisationnodes instanceof NodeList
serait bien aussi.Personnellement, je voudrais juste de ne pas prendre le
isNodeList
fonction, à cause de sa lenteur, de la coutume et trop de frais généraux.Référence: https://jsperf.com/check-for-nodelist