Как получить содержимое <noscript> в Javascript в IE7?

Я пытаюсь получить содержание <noscript> тег с использованием Javascript. Я успешно смог получить его в FF, Chrome, Opera и даже IE6, но потерпел неудачу в IE7 (еще не пробовал IE8+).

В основном, вот сокращенная версия кода:

<noscript>Lorem ipsum</noscript>
<script>
    var noscript = document.getElementsByTagName('noscript')[0];
    noscript.textContent; // undefined
    noscript.innerHTML; // empty string
    noscript.childNodes.length; // 0
</script>

Я попытался добавить элемент внутрь и нацелить их, но безуспешно. Я попытался обернуть в родительский элемент и получить его .innerHTML, но ничего между <noscript> метки отбрасываются.

Примечание: я создаю сценарий lazyloader и <noscript> элемент как раз то что мне нужно (<img>src атрибуты внутри <noscript> тег не выбирается браузером.)

9 ответов

Решение

В IE 7 и 8 просто невозможно получить содержимое <noscript> элемент. Любой контент между <noscript> а также </noscript> теги в HTML не отражаются в DOM в IE, элемент не имеет дочерних элементов и innerHTML а также innerText пустые строки.

В IE 6 ситуация любопытна: как и в IE 7, <noscript> элемент не имеет дочерних узлов, но его содержимое отражено в innerHTML а также outerHTML (но нет innerText) свойства элемента.

Все это в вашем случае, единственный вариант в IE, чтобы поместить контент в <noscript> элемент внутри какого-то другого элемента вместо. Подражать поведению <noscript> элемент, вы можете поместить содержимое в элемент, который сразу скрыт JavaScript (когда скрипт включен):

<div id="noscript">Lorem ipsum</div>
<script type="text/javascript">
    document.getElementById("noscript").style.display = "none";
</script>

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

<!--[if (gt IE 8)|!(IE)]><!--><noscript><!--<![endif]-->
  <img src="/path/to/img.jpg" alt="photo" />
<!--[if (gt IE 8)|!(IE)]><!--></noscript><!--<![endif]-->

JavaScript (jQuery - если вам нужен настоящий JS, дайте мне знать):

jQuery(function($) {
  $('noscript').each(function() {
    var $this = $(this);
    $this.replaceWith($this.text());
  });
});

Протестировано с IE7+, Chrome, FF3.6+, Opera11

Чтобы обойти это, нужно продублировать содержимое noscript в качестве его атрибута.

Например:

<noscript id="ns" alt="Lorem ipsulum">Lurem ipsulum</noscript>

По сценарию получаем значение атрибута alt вместо его innerHTML

<script>
   var ns = document.getElementByid('ns');
   var htm = ns.innerHTML || ns.getAttribute('alt');

   alert(htm);

</script> 

Вы можете получить доступ к тегу noscript textContent свойство в большинстве современных браузеров. Для старых браузеров я написал polyfill, который работает довольно быстро и во всех настольных и мобильных браузерах, которые я мог протестировать.

Посмотреть сообщение в блоге: http://queryj.wordpress.com/2012/07/06/read-noscript-tag-content-reliably-in-all-browsers/

Посмотреть код (Двойная лицензия под лицензиями MIT и GPL): https://github.com/jameswestgate/noscript-textcontent/

РЕДАКТИРОВАТЬ:

Сценарий работает путем перезагрузки страницы с помощью ajax-запроса (который должен быть кэширован в браузере) и синтаксического анализа содержимого для браузеров, которые не поддерживают textContent имущество

Вы могли бы

<script>document.write('<script id="images" type="text/html">')</script>

как раз перед изображениями, а затем

<script>document.write('</scr'+'ipt>')</script>

после этого. У вас будут изображения, доступные без javascript, а с помощью JavaScript вы сможете получить их источники в $('images'). InnerHTML

У меня другой подход, с рабочим примером этого здесь: https://github.com/jokeyrhyme/noscript.js/blob/c104c480b595278e9d559aaf8a26668b7c852f72/noscript.js#L25

Мой подход прост:

  1. выполнить XHR, чтобы загрузить необработанную копию исходного HTML
  2. найти все элементы noscript в DOM
  3. найти все элементы noscript в оригинальном HTML
  4. замените надписи DOM содержимым оригинальных надписей

мой noscript.show() Метод проверяет, нужно ли это в первую очередь. Для большинства браузеров он просто перемещает содержимое элементов noscript, чтобы они были видны.

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

Примечание: из-за правила Same-Origin у вас могут возникнуть проблемы при использовании этой техники при просмотре файлов на локальном диске через file:///..., так что, вероятно, будет работать только при просмотре через http://... или же https://...,

Это действительно грязный хак, и он полностью не проверен, но у меня просто возникла идея:D

Вы можете сделать, как предлагали другие, поместить содержимое в div, а не в noscript, и, в дополнение к его скрытию, немедленно удалить src атрибут всех img теги, использующие что-то для эффекта:

jQuery(function () { 
    jQuery('div#noscript img').attr('src', '');
  });

Это должно ограничивать (но не исключать) выборку изображений.

Это всего лишь основано на комментариях и предложениях других, надеюсь, это поможет.


Редактировать - еще один грязный хак, о котором я только что подумал, который предполагает, что вы можете изменить место, где живет html, поэтому может иметь или не иметь отношение:

Внутри noscript есть

<iframe width="100%" height="100%" src="?noscript=true" />

тогда ты можешь XMLHttpRequest для содержания noscript...

В данный момент у меня нет браузера ie;), насколько я помню, содержание <noscript> тег доступен, когда вы получаете родительский тег .innerHTML(), Тогда это зависит от вас, чтобы получить его (с неприятным регулярным выражением, например)

Я не могу проверить это по крайней мере в течение 7 часов, поэтому я публикую эту информацию как есть.

PS. Мой совет - переделать. Теги Noscript должны содержать материал, который НЕ используется, когда скрипты включены.

Вы запрашиваете элементы скрипта вместо элементов noscript. Это работает во всех браузерах:

<noscript>Lorem ipsum</noscript>
<script>
    var noscript = document.getElementsByTagName('noscript')[0];
    alert(noscript.innerHTML); // Lorem ipsum
</script>
Другие вопросы по тегам