Je sais que les attributs individuels peuvent être récupérés avec la méthode attr()
, mais j'essaie d'itérer sur tous les attributs d'un élément. Pour le contexte, j'utilise jQuery sur du XML ...
<items>
<item id="id123" name="Fizz" value="Buzz" type="xyz">
<subitem name="foo">
<subitem name="bar">
</item>
<item id="id456" name="Bizz" value="Bazz" type="abc">
<subitem name="meh">
<subitem name="hem">
</item>
</items>
Je peux déjà parcourir les éléments avec ...
$(xml).find('item').each(function() {
// Do something to each item here...
});
Mais j'aimerais pouvoir obtenir un tableau d'attributs pour chaque `` élément '' afin que je puisse ensuite répéter ceux-ci ...
par exemple.
$(xml).find('item').each(function() {
var attributes = $(this).attributes(); // returns an array of attributes?
for (attribute in attributes) {
// Do something with each attribute...
}
});
J'ai fait quelques recherches ici, dans la documentation jQuery, et ailleurs via Google mais je n'ai pas eu de chance. Si rien d'autre, j'ai peut-être du mal à exclure les résultats relatifs à la méthode attr()
de l'objet jQuery. Merci d'avance.
La meilleure façon est d'utiliser directement l'objet nœud en utilisant sa propriété attributes
. La seule différence dans ma solution ci-dessous par rapport aux autres suggérant cette méthode est que j'utiliserais .each
à nouveau au lieu d'une boucle js traditionnelle:
$(xml).find('item').each(function() {
$.each(this.attributes, function(i, attrib){
var name = attrib.name;
var value = attrib.value;
// do your magic :-)
});
});
il semble que vous devez utiliser le vieux javascript de Vanilla:
for (var i = 0; i < elem.attributes.length; i++) {
var attrib = elem.attributes[i];
if (attrib.specified == true) {
console.log(attrib.name + " = " + attrib.value);
}
}
Pourriez-vous obtenir l'élément DOM à partir du wrapper jQuery à l'aide de la fonction get (), puis itérer les attributs DOM?
var node = $(myStuff).get(0);
if (node.attributes.length) {
for (var length = attrs.length, i = 0; i < length; i++) {
if (attrs[i].specified) {
}
}
}
Pour une gestion des attributs DOM beaucoup plus robuste, consultez cet article de blog .
Que diriez-vous?
$(xml).find('item').each(function() {
var attributes = $(this)[0].attributes;
for (attribute in attributes) {
// Do something with each attribute...
}
});
Bien que vous puissiez simplement utiliser l'attribut d'élément DOM standard attributes
, il inclura l'attribut every (même ceux qui ne sont pas définis explicitement) dans IE6. Vous pouvez également limiter le nombre d'attributs que vous définissez:
var use_attributes = ['id','name','value','type'];
$(xml).find('item').each(function() {
var $item = $(this);
$.each( use_attributes, function(){
if($item.attr( this )){
// Act on the attribute here.
// `this` = attribute name
// $item.attr( this ) = attribute value
}
})
});
function findByAll(toLookFor, lookInText) {
return $('*').filter(function() {
return Array.prototype.some.call(this.attributes, function(attr) {
return attr.value.indexOf(toLookFor) >= 0;
}) || (lookInText && $(this).text().indexOf(toLookFor) >= 0);
});
}
Je poste ici parce que je pense que cela peut aider d'autres personnes qui arrivent à cette publication à chercher à analyser un fichier xml comme je l'étais.
Je cherchais une méthode pour parcourir un fichier xml avec une structure très similaire à celle de theracoonbear et stocker les résultats dans un tableau et suis tombé sur cette publication.
J'ai regardé le code de prodigitalson mais je n'ai tout simplement pas pu faire fonctionner cette syntaxe - avec firefox se plaignant que dans la ligne:
$.each(this.attributes, function(i, attrib){
cette
this.attributes
n'est pas une fonction définie. Je suis sûr que l'erreur est entièrement la mienne. Mais j'ai passé plusieurs heures à essayer de faire fonctionner cela et j'ai échoué
Ce qui a fonctionné pour moi était (où mon nom de tag est session au lieu de l'élément): -
$(xml_Data).find("session").each(function() {
console.log("found session");
$(this).children().each(function(){
console.log("found child " + this.tagName);
console.log("attributes" + $(this).text());
});
});
J'apprécie que cela ne réponde pas exactement à la question d'origine. Cependant, j'espère que cela pourra faire gagner du temps aux autres visiteurs de ce message.
Cordialement