В jQuery я пытаюсь выбрать только те узлы монтирования, где текстовые значения a и b равны 64 и «тестируются» соответственно. Я также хотел бы вернуться к 32, если нет 64 и «тест» существует. Что я вижу в приведенном ниже коде, так это то, что монтирование 32 возвращается вместо 64.
XML:
<thingses>
<thing>
<a>32</a> <-- note, a here is 32 and not 64 -->
<other>...</other>
<mount>sample 1</mount>
<b>test</b>
</thing>
<thing>
<a>64</a>
<other>...</other>
<mount>sample 2</mount>
<b>test</b>
</thing>
<thing>
<a>64</a>
<other>...</other>
<mount>sample 3</mount>
<b>unrelated</b>
</thing>
<thing>
<a>128</a>
<other>...</other>
<mount>sample 4</mount>
<b>unrelated</b>
</thing>
</thingses>
И, к сожалению, я не могу контролировать XML, поскольку он откуда-то еще.
То, что я сейчас делаю, это:
var ret_val = '';
$data.find('thingses thing').each(function(i, node) {
var $node = $(node), found_node = $node.find('b:first:is(test), a:first:is(64)').end().find('mount:first').text();
if(found_node) {
ret_val = found_node;
return;
}
found_node = $node.find('b:first:is(test), a:first:is(32)').end().find('mount:first').text();
if(found_node) {
ret_val = found_node;
return;
}
ret_val = 'not found';
});
// expected result is "sample 2", but if sample 2's parent "thing" was missing, the result would be "sample 1"
alert(ret_val);
Для моего селектора ": is" я использую:
if(jQuery){
jQuery.expr[":"].is = function(obj, index, meta, stack){
return (obj.textContent || obj.innerText || $(obj).text() || "").toLowerCase() == meta[3].toLowerCase();
};
}
Должен быть лучший способ, чем то, как я это делаю. Я хотел бы заменить "," на "И" или что-то в этом роде. :)
Любая помощь будет высоко ценится. спасибо!