Отключить атрибут элемента в DOM - PullRequest
2 голосов
/ 28 апреля 2011

Я использую cloneNode(true) для создания копий элементов DOM (например, div, содержащий несколько диапазонов, которые содержат текст и могут быть вложенными). Я хочу удалить все атрибуты id из копий, чтобы document.getElementById нашел исходный элемент.

Как мне это сделать? node.setAttribute('id','');, кажется, работает, но мне интересно, удаляет ли это его или просто устанавливает его id в строку нулевой длины (что по-прежнему означает, что у меня есть множество элементов с одинаковым идентификатором).

Также мне интересно, как я могу рекурсивно стереть идентификаторы, чтобы я мог гарантировать, что все идентификаторы в копиях будут стерты, чтобы я мог безопасно продолжать ссылаться на элементы (оригиналы, конечно) по идентификатору. Пока у меня есть это:

function recursive_erase_id(node) {
    node.setAttribute('id','');
    var children = node.childNodes;
    if (children) recursive_erase(children);
}

Ответы [ 5 ]

1 голос
/ 28 апреля 2011

Я построил скрипку здесь.Он использует removeAttribute и рекурсивную функцию для удаления идентификаторов из оригинала.Альтернативой является установка идентификатора в нуль.Оба работают.Если вы возитесь с скрипкой ;-) и осмотрите клонированные элементы с помощью инспектора dom из браузера, вы увидите, что у всех клонов больше нет идентификатора.

1 голос
/ 28 апреля 2011

Что касается рекурсии, это должно работать (хотя и не проверено):

function recursive_erase_id(node) {
    if (node.removeAttribute) { // Or node.nodeType == Node.ELEMENT_NODE
                                // Or even node.nodeType == 1 (IE and Opera does not define the NodeType constants!)
        node.removeAttribute('id');
    }

    var children = node.childNodes;
    for (var i = 0, j = children.length; i < j; i++) {
        recursive_erase_id(children.item(i)); // Depth-first.
    }
}
1 голос
/ 28 апреля 2011

Как насчет node.removeAttribute('id')?

0 голосов
/ 28 апреля 2011

Также обратите внимание, что метод cloneNode() не копирует свойства JavaScript, добавленные вами в DOM узлы, такие как обработчики событий. Этот метод копирует только атрибуты и, необязательно, дочерние узлы. Все остальное потеряно. В IE есть ошибка, когда обработчики событий также клонирован, поэтому рекомендуется удалять обработчики событий перед клонированием.

0 голосов
/ 28 апреля 2011

Чтобы ответить на ваш первый вопрос, вам нужно будет использовать removeAttribute (name) вместо установки атрибута в пустую строку. Вы можете установить новый атрибут при копировании через setAttribute, но я бы порекомендовал сделать это после удаления старого.

Ваш второй вопрос касается удаления атрибутов при копировании. Возможно, создание подобной функции решит проблему при копировании:

var customClone = function(el) {
    var newElement = el.cloneNode(true);
    newElement.removeAttribute('id'); // set later on?
}

Надеюсь, что это дает некоторые рекомендации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...