(Vedi sotto per una soluzione completa, in gran parte, non testato, e certamente non-refactoring off-the-bracciale Ma in primo luogo, i bit e pezzi di esso.).
confrontando le loro innerHTML
è facile:
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
... anche se bisogna chiedersi se questi due elementi sono equivalenti in base ai criteri:
<div><span class="foo" data-x="bar">x</span></div>
<div><span data-x="bar" class="foo">x</span></div>
... perché il loro innerHTML
sarà diverso (almeno su Chrome e sospetto sulla maggior parte se non su tutti i browser). (Altro su quello sotto.)
Quindi è necessario confrontare tutti i loro attributi. Per quanto ne so, jQuery non ti dà un mezzo di enumerare gli attributi, ma il DOM fa:
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;
}
Poi
var names = [getAttributeNames(div[0]), getAttributeNames(div[1])];
if (names[0].length === names[1].length) {
// Same number, loop through and compare names and values
...
}
Nota che di classificare gli array di cui sopra, sono supponendo che l'ordine dei loro attributi non sia significativo nella tua definizione di "equivalente". Spero che sia il caso, perché non sembra essere conservato, in quanto ottengo risultati diversi da diversi browser durante l'esecuzione di this test. Stando così le cose, dobbiamo tornare alla domanda innerHTML
, perché se l'ordine degli attributi sugli elementi stessi non è significativo, allora presumibilmente l'ordine degli attributi sugli elementi discendenti non dovrebbe essere significativo. Se è il caso, avrai bisogno di una funzione ricorsiva che controlli i discendenti in base alla tua definizione di equivalente, e non usare affatto innerHTML
.
Ma dovresti essere in grado di mettere insieme qualcosa dai pezzi sopra per confrontare due elementi in base ai tuoi criteri.
più da esplorare:
La domanda mi ha interessato in modo strano, così ho preso a calci girovagare per un po 'e inventare quanto segue. È per lo più non testato, potrebbe usare qualche refactoring, ecc., Ma dovrebbe farti arrivare quasi tutto lì. Faccio, ancora una volta, supporre che l'ordine degli attributi non sia significativo. Il sotto assume anche la minima differenza nel testo è significativo.
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;
}
esempi:
* "Incluso il loro ... Id ..." * Se i valori di 'id' corrispondono, l'HTML in questione non è valido. I valori id '** devono ** essere unici nella pagina. –
Suppongo che tu voglia trattare due elementi con gli stessi attributi elencati in un ordine diverso come equivalente ...? Ad esempio, '
Ma poi non sono * identici * ... –