Уникальный идентификатор элемента, даже если у элемента его нет - PullRequest
29 голосов
/ 22 октября 2008

Я пишу скрипт GreaseMonkey, в котором я перебираю кучу элементов. Для каждого элемента мне нужен идентификатор строки, который я могу использовать для ссылки на этот элемент позже. Сам элемент не имеет атрибута id, и я не могу изменить исходный документ, чтобы получить его (хотя я могу вносить изменения в DOM в моем скрипте). Я не могу сохранить ссылки в моем скрипте, потому что, когда они мне понадобятся, сам скрипт GreaseMonkey выйдет из области видимости. Есть ли способ, например, получить «внутренний» идентификатор, который использует браузер? Подходит только для Firefox; кросс-браузерное решение, которое может быть применено в других сценариях, было бы замечательно.

Edit:

  • Если сценарий GreaseMonkey находится вне области действия, как вы будете ссылаться на элементы позже? Они сценария GreaseMonkey добавляют события к объектам DOM. Я не могу сохранить ссылки в массиве или каком-либо другом подобном механизме, потому что, когда событие сработает, массив исчезнет, ​​потому что скрипт GreaseMonkey выйдет из области видимости. Таким образом, событию нужен какой-то способ узнать ссылку на элемент, которая была в сценарии, когда событие было присоединено. И рассматриваемый элемент не тот, к которому он прикреплен.

  • Разве вы не можете просто использовать пользовательское свойство для элемента? Да, но проблема в поиске. Я должен был бы прибегнуть к переборам всех элементов, ища тот, у которого это пользовательское свойство установлено в желаемый идентификатор. Конечно, это сработает, но в больших документах это может занять очень много времени. Я ищу что-то, где браузер может выполнять работу поиска.

  • Подождите, вы можете или не можете изменить документ? Я не могу изменить исходный документ, но могу внести изменения в DOM в сценарии. Я уточню в вопросе.

  • Разве вы не можете использовать замыкания? Закрытия оказались эффективными, хотя я изначально думал, что они не будут. Смотрите мой следующий пост.

Звучит как ответ на вопрос: "Могу ли я использовать какой-нибудь внутренний идентификатор браузера?" это "Нет."

Ответы [ 13 ]

0 голосов
/ 24 июня 2014

ОК, нет идентификатора, связанного с элементом DOM автоматически. DOM имеет иерархическую структуру элементов, которая является основной информацией. С этой точки зрения вы можете связывать данные с элементами DOM с помощью jQuery или jQLite. Это может решить некоторые проблемы, когда вам нужно привязать пользовательские данные к элементам.

0 голосов
/ 30 марта 2010

Мне кажется, я только что решил проблему, подобную этой. Однако я использую jQuery в среде DOM браузера.

var objA = $ («селектор для некоторого элемента dom»); var objB = $ ("селектор для другого элемента dom");

if (objA [0] === objB [0]) { //ОТЛИЧНЫЙ! два объекта указывают на один и тот же DOM-узел }

0 голосов
/ 22 октября 2008

В javascript вы можете прикрепить поле собственного идентификатора к узлу

if(node.id) {
  node.myId = node.id;
} else {
  node.myId = createId();
}

// store myId

Это немного взломано, но оно даст каждому узлу идентификатор, который вы можете использовать. Конечно, document.getElementById() не обратит на это внимания.

...