Подтвердить что ты не робот

Как получить содержание <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 script, а элемент <noscript> - это то, что мне нужно (<img> src атрибуты внутри тега <noscript> не выбраны браузером.)

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Не самое изящное решение - Загрузка изображений как обычно с 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

Ответ 3

Для этого нужно создать дубликат содержимого noscript в качестве его атрибута.

Например:

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

На script получите значение атрибута alt вместо innerHTML

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

   alert(htm);

</script> 

Ответ 4

Вы могли

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

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

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

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

Ответ 5

В большинстве современных браузеров вы можете получить доступ к тегу noscript tag 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/

EDIT:

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

Ответ 6

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

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

  • выполнить XHR для загрузки исходной копии исходного HTML
  • найти все элементы noscript в DOM
  • найти все элементы noscript в исходном HTML
  • заменить DOM noscripts на содержимое исходных текстов

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

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

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


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

Внутри noscript есть

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

то вы можете XMLHttpRequest для содержимого noscript...

Ответ 9

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

<noscript>Lorem ipsum</noscript>
<script>
    var noscript = document.getElementsByTagName('noscript')[0];
    alert(noscript.innerHTML); // Lorem ipsum
</script>