document.getElementsByTagName ("*") или document.all - PullRequest
3 голосов
/ 19 января 2010

document.getElementsByTagName("*") работает для IE / Firefox / Opera, но не работает для Chrome и Safari.

document.all работает для IE / Chrom / Safari, но не работает для Firefox.

Как с этим справиться?

Ответы [ 6 ]

5 голосов
/ 19 января 2010

Попробуй так:

if (document.all !== undefined)
{
   allElements = document.all;
}
else
{
   allElements = document.getElementsByTagName("*");
}

или более короткая версия

allElements = document.all ? document.all : document.getElementsByTagName("*");
3 голосов
/ 07 марта 2010

document.getElementsByTagName() отлично работает во всех современных браузерах (все новее, чем IE5).

Если кажется, что он не работает в Chrome или Safari, то, скорее всего, это просто признак ошибки, возникшей в другом месте.

0 голосов
/ 26 сентября 2017

Без достаточного количества представителей, чтобы прокомментировать ответ @Khurram Hassan, я выложу его здесь вместе со своим ответом на оригинальный вопрос.

Во-первых, оригинальный вопрос. Мое решение будет (и находится в моем собственном коде, в ожидании ответа на проблему с ним, которую я поставил на этом сайте) document.getElementsByTagName ("*"), которая фактически получает каждый элемент в Chrome. Я протестировал его на google.com в Google Chrome с загруженным профилем и восемью наиболее часто посещаемыми сайтами в списке, и получилось 356 отдельных элементов с именем тега. Справедливости ради, это включало html, head, body и другие, которые, вероятно, бесполезны, но все же получили их. В настоящий момент у меня нет доступа к Opera, но поскольку Chrome все еще принимает этот фрагмент JavaScript, я не вижу причины, по которой он не принял бы это в вашем коде.

Во-вторых, для @Khurram hassan document.getElementById() не может использоваться в этом случае. Я только что проверил его на Chrome, и он получил значение null. Теоретически, в этом случае может быть использовано что-либо с общей формой getElementsBy*, а не getElementBy*. Итак, чтобы добавить к моему более раннему ответу, вы также можете попробовать ClassName, Name и TagNameNS в зависимости от того, что вы пытаетесь сделать. На той же странице, что и раньше, я тестировал эти три, и хотя работал только TagNameNS, остальные просто возвращали пустые списки, а не ошибки.

Далее, если это правда, что вам не нужен <!DOCTYPE html> в вашем коде, возможно, вы могли бы опубликовать рабочий код в качестве редактирования своего ответа, чтобы мы могли его увидеть. Насколько мне известно, <!DOCTYPE html> является общепринятым (и обычно предполагаемым обязательным) способом запуска HTML-страницы. Если в этом нет необходимости, то это будет новая информация (по крайней мере, для меня), которая может оказаться полезной либо для отладки, либо для непубличных веб-страниц в будущем.

0 голосов
/ 16 марта 2013

document.all следует избегать, так как он не соответствует стандартам. Вместо этого вы можете использовать document.getElementById() для конкретного узла или использовать $("*") Для выбора всех элементов с помощью jQuery.

Но все же, если вы хотите использовать document.all, проследите за тем, чтобы с вашей страницы удалялся тег <!DOCTYPE>, а с вашего <html> тега также удалялся атрибут xmlns.

Измените что-нибудь вроде этого:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

до:

<html>

Я протестировал его на FireFox 19.0.2, и document.all отлично работает для меня.

Причина: Когда вы используете тег <!DOCTYPE>, вы сообщаете браузеру, что ваша веб-страница соответствует требованиям стандартов, согласно которым вы НЕ должны использовать document.all в своем скрипте, поэтому браузер и не позволяет этого.

Но поскольку вы хотите его использовать, вы явно не соблюдаете стандарты, поэтому даже не пытайтесь добавить тег <!DOCTYPE>, иначе document.all не будет работать.

0 голосов
/ 18 января 2012

Хотя я бы не советовал вам делать документ.все, потому что это подразумевает, что вы делаете много разборов на стороне клиента, которые просто не нужны, я понимаю, что есть много устаревших вещей и т.д. опубликовать небольшое расширение моих мыслей о методе-оболочке для document.all.

document.all = document.all || function(){
   return document.getElementsByTagName("*");
};

Конечно, это предполагает, что у вас есть функция getElementsByTagName, которая должна иметь место.

0 голосов
/ 19 января 2010

Я признаю, что сегодня могут существовать технологии, о которых я не знаю, которые позволяют делать подобные вещи в кросс-браузерном формате, но в прошлом мне всегда приходилось делать это так, чтобыкакая-то проверка, для какого браузера вы используете.

Однако более простое решение - попытаться запустить один из них, а если вы ничего не получите / ноль / ошибка, используйте другой.1003 *

В любом случае, если вы действительно не хотите заниматься этим самостоятельно, вам следует использовать библиотеку, которая будет заниматься этим для вас (например, jQuery).

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