11

私はJavascriptで名前のリストを管理しています。チェックボックスをオンにすると、あなたの名前がリストに表示されます。チェックを外すと消されます。ボックスを不定状態にすると、名前が削除されます。

非表示の div に現在ログインしているユーザーの名前があります。名前は、スタイル属性を持つスパンです。

isEqualNode を使用して、名前が既にリストにあるかどうかを確認します。ページがロードされたときにリストにある場合は、正常に機能します。名前が見つかったため、ボックスのチェック状態が変わると更新されます。

for(var i=0 ; i < bullet.childNodes.length ; i++) {
    var node = bullet.childNodes[i];
    if(node.className == 'crossed')
        node = node.firstChild;
    if(node.isEqualNode(document.getElementById('curUser').firstChild))
        break;
}
// if i < bullet.childNodes.length, then we found the user's name in the list

名前がリストにない場合は、スパンを複製します。

var newName = document.getElementById('curUser').firstChild.cloneNode(true);
bullet.appendChild(newName);

これは視覚的に機能します。

しかし、私は何かトリッキーなことに出くわしました: それnewName.isEqualNode(document.getElementById('curUser').firstChild)は誤りです! そのため、ボックスの状態が再び変化した場合、新しく追加された名前は見つからず、新しい名前が再び作成されます。

スパンは次のようになります。

<span style="font-weight: bold ; color: #003380 ;">Pikrass</span>

今のところ、チェックの厳密性を下げます (isEqualNode に頼るのではなく、スパン内のテキスト データをチェックするだけです)。 isEqualNode.

関連する仕様: cloneNodeisEqualNode


編集: Firefox と Chromium でテストしました。Firefox では isEqualNode は false を返しますが、Chromium では true を返します。これを指摘してくれたフェリックスに感謝します。

4

3 に答える 3

4

これを理解しただけです。仕様によると、 isEqualNode は、両方の要素が同じ量の属性を持っている場合にのみ true を返します。ただし、ソース要素に ID がある場合、ID は一意である必要があるためコピーされず、属性が少なくなります。ID の代わりにクラスを使用すると、正常に動作します。

マークアップ:

<div id="withId">withId content</div>
<div class="withoutId">withoutId content</div>

JS:

function test(node) {
    var copy = node.clone(true);
    document.body.appendChild(copy);
    console.log('are equal: ' + copy.isEqualNode(node)
        + ', attributes lengths: ' + node.attributes.length + ' ' + copy.attributes.length
        + ', ids: ' + node.getAttribute('id') + ' ' + copy.getAttribute('id'));
}

test(document.getElementById('withId'));
// are equal: false, attributes lengths: 1 0, ids: withId null

test(document.getElementsByClassName('withoutId')[0]);
// are equal: true, attributes lengths: 1 1, ids: null null

http://jsfiddle.net/igorz/fxtDw/

于 2013-02-19T15:30:39.257 に答える
2

ここに書かれていますMozillaのリファレンス(thanks @Bergi)

cloneNode() によって返された複製ノードは、別のノードに追加されたときに新しい uniqueID を受け取ります

追加を行っているため、この時点で id が変更されている可能性があります。

于 2013-03-22T16:56:46.337 に答える
0

遅いよりはましです。:)

Firefox 17 でこの問題を再現することはできません。コメントで説明されているように、これはおそらく Gecko のバグであり、その後修正されました。

ただし、バグレポートは見つかりませんでした。今のところ、この回答に承認済みのフラグを立てますが、誰かがバグレポートまたはボンネットの下で何が起こっていたかの説明を見つけることができれば、代わりにそれを受け入れます.

Bergi のコメントは、他の 2 つの回答に当てはまります。

于 2013-08-10T18:12:35.653 に答える