Я управляю списком имен в 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 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), но меня интересует, почему клонированный node может отличаться от оригинальный, согласно isEqualNode.
Соответствующие спецификации: cloneNode, isEqualNode
EDIT: Я тестировал с Firefox и Chromium. С Firefox isEqualNode возвращает false, но с Chromium он возвращает true. Спасибо Феликс за это.