(см ниже для полного, в основном, непроверенного, и, конечно, не-реорганизованным решения неподготовленного Но первые биты и куски его..)
Сравнивая их innerHTML
легко:
if (divs[0].innerHTML === divs[1].innerHTML)
// or if you prefer using jQuery
if (divs.html() === $(divs[1]).html()) // The first one will just be the HTML from div 0
... хотя вы должны спросить себя, является ли эквивалентны эти два элемента в соответствии с вашими критериями:
<div><span class="foo" data-x="bar">x</span></div>
<div><span data-x="bar" class="foo">x</span></div>
... потому что их innerHTML
будет разных (по крайней мере, на Chrome, и я подозреваю, что большинство, если не всех браузеров). (Подробнее об этом ниже.)
Затем вам нужно сравнить все их атрибуты. Насколько я знаю, JQuery не дает вам средства перечисления атрибутов, но DOM делает:
function getAttributeNames(node) {
var index, rv, attrs;
rv = [];
attrs = node.attributes;
for (index = 0; index < attrs.length; ++index) {
rv.push(attrs[index].nodeName);
}
rv.sort();
return rv;
}
Тогда
var names = [getAttributeNames(div[0]), getAttributeNames(div[1])];
if (names[0].length === names[1].length) {
// Same number, loop through and compare names and values
...
}
Обратите внимание, что при сортировке массивов выше, я при условии, что порядок их атрибутов не имеет значения в вашем определении «эквивалент». Надеюсь, так оно и есть, потому что похоже, что оно не сохранилось, поскольку при запуске this test у меня разные результаты из разных браузеров. В этом случае мы должны вернуться к вопросу innerHTML
, потому что, если порядок атрибутов на самих элементах не является значительным, то, предположительно, порядок атрибутов для элементов-потомков не должен быть значительным. Если в случае это, вам понадобится рекурсивная функция, которая проверяет потомков в соответствии с вашим определением эквивалента и вообще не использует innerHTML
.
Но вы должны уметь собрать что-то вместе с кусками выше, чтобы сравнить два элемента в соответствии с вашими критериями.
Подробнее изучить:
вопрос заинтересовал меня странно, поэтому я пнул вокруг на некоторое время, и придумал следующее. Это, в основном, непроверено, может использовать какой-то рефакторинг и т. Д., Но он должен получить от вас большую часть пути. Я, опять же, предполагаю, что порядок атрибутов не имеет значения. Нижеследующее предполагает, что даже малейшая разница в тексте составляет.
function getAttributeNames(node) {
var index, rv, attrs;
rv = [];
attrs = node.attributes;
for (index = 0; index < attrs.length; ++index) {
rv.push(attrs[index].nodeName);
}
rv.sort();
return rv;
}
function equivElms(elm1, elm2) {
var attrs1, attrs2, name, node1, node2;
// Compare attributes without order sensitivity
attrs1 = getAttributeNames(elm1);
attrs2 = getAttributeNames(elm2);
if (attrs1.join(",") !== attrs2.join(",")) {
display("Found nodes with different sets of attributes; not equiv");
return false;
}
// ...and values
// unless you want to compare DOM0 event handlers
// (onclick="...")
for (index = 0; index < attrs1.length; ++index) {
name = attrs1[index];
if (elm1.getAttribute(name) !== elm2.getAttribute(name)) {
display("Found nodes with mis-matched values for attribute '" + name + "'; not equiv");
return false;
}
}
// Walk the children
for (node1 = elm1.firstChild, node2 = elm2.firstChild;
node1 && node2;
node1 = node1.nextSibling, node2 = node2.nextSibling) {
if (node1.nodeType !== node2.nodeType) {
display("Found nodes of different types; not equiv");
return false;
}
if (node1.nodeType === 1) { // Element
if (!equivElms(node1, node2)) {
return false;
}
}
else if (node1.nodeValue !== node2.nodeValue) {
display("Found nodes with mis-matched nodeValues; not equiv");
return false;
}
}
if (node1 || node2) {
// One of the elements had more nodes than the other
display("Found more children of one element than the other; not equivalent");
return false;
}
// Seem the same
return true;
}
Живые примеры:
* «Включая их ... Id ...» * Если их значения 'id' совпадают, соответствующий HTML-код недействителен. Значения 'id' ** должны быть уникальными на странице. –
Я предполагаю, что вы хотите обработать два элемента с теми же атрибутами, которые перечислены в другом порядке как эквивалентные ...? Например, '
Но тогда они не идентичны * ... –