Я пишу расширение для Chrome, которое должно обнаруживать contenteditable
HTML-элементы (или элементы, в которые пользователь может вводить текст) на странице, куда вставляется мой контекстный скрипт.
Я сейчас делаю это:
var objAll = document.getElementsByTagName("*");
for(var i = 0; i < objAll.length; i++)
{
obj = objAll[i];
if(obj.contentEditable &&
obj.contentEditable != 'inherit' &&
obj.contentEditable != 'false')
{
//Yes, this is a content editable element!
}
}
Но мой метод работает не на всех сайтах, на которых я его тестировал.
Мне интересно, что я там упускаю?
PS. Поскольку это скрипт контента, я не использую jQuery, чтобы сделать его более надежным.
document.querySelectorAll('[contenteditable]')
этого не делает. Только когда я делаюif (obj.isContentEditable)
вместо того, что у меня было, и сохраняюdocument.getElementsByTagName("*")
, это работает для моей конкретной тестовой страницы. Есть идеи, почему? 10.09.2014getElementsByTagName
возвращает живую коллекцию, поэтому она изменяется при добавлении новых элементов, аquerySelectorAll
— это моментальный снимок запроса в DOM. Таким образом, вы должны вызвать его снова, если за это время были добавлены некоторые элементы. 10.09.2014document.getElementsByTagName("*")
, верно? 10.09.2014Write a comment...
в нижней части страницы. Трудно сказать, создается ли он динамически. 10.09.2014<iframe>
), который доступен для редактирования. Это зависит не от атрибутаcontenteditable
, а скорее от свойстваdesignMode
, для которого установлено значение"on"
в документе, а не в отдельном элементе. Вот почему селектор не работает. 10.09.2014obj.designMode
в извлеченных элементах DOM? 10.09.2014contentDocument
. 10.09.2014