Доступ к содержимому ‹noscript› с помощью Javascript

<noscript><div id="example">I want to get this innerHTML</div></noscript>

<script type="text/javascript"> alert($('example').innerHTML);</script>

Этот фрагмент javascript просто возвращает пустую строку. Есть ли способ получить содержимое узла noscript?

p.s. Я использую прототип в этом конкретном проекте.


person macinjosh    schedule 06.03.2009    source источник
comment
Попробуйте $($(noscript).text()) с jQuery.   -  person sibidiba    schedule 18.08.2012
comment
Это ^ работает. По крайней мере, в Chrome 32.   -  person Jazzy    schedule 13.02.2014


Ответы (5)


Если сценарии включены, элемент noscript определяется как содержащий только текст — хотя это должен быть поддающийся разбору текст с некоторыми ограничениями по содержанию. Имея это в виду, вы должны иметь возможность извлекать текст, анализировать его, а затем находить нужный элемент. Элементарный пример этого следующий:

var nos = document.getElementsByTagName("noscript")[0]; 
// in some browsers, contents of noscript hang around in one form or another
var nosHtml = nos.textContent||nos.innerHTML; 

if ( nosHtml )
{
  var temp = document.createElement("div");
  temp.innerHTML = nosHtml;

  // lazy man's query library: add it, find it, remove it
  document.body.appendChild(temp);
  var ex = document.getElementById("example");
  document.body.removeChild(temp);

  alert(ex.innerHTML);
}

Обратите внимание, что когда я изначально писал этот ответ, вышеприведенное не удалось выполнить в Google Chrome; доступ к содержимому noscript в наши дни поддерживается несколько лучше, но он по-прежнему кажется мне крайним случаем, который, возможно, несколько чаще, чем другие элементы, демонстрирует ошибки - я бы избегал этого, если у вас есть другие варианты.

person Shog9    schedule 07.03.2009
comment
Кажется, это не работает в IE7 (XP). Однако я работаю в IE6. - person pixelastic; 26.11.2010
comment
Попробуйте $($(noscript).text()) с jQuery. - person sibidiba; 18.08.2012
comment
@ Shog9 Shog9 Все это время спустя, не могли бы вы прояснить кое-что об этом ответе? in Google's Chrome, the noscript element has no children in the DOM - если я правильно понимаю, вы говорите, что версия Chrome, которую вы тестировали в то время, полностью очистила содержимое тегов noscript при включенном Javascript, тем самым сделав его внутреннее содержимое пустым? Если это правда, то это выглядит немного странно. Сегодня я пытаюсь реализовать что-то подобное, но мне интересно, не уточняет ли спецификация noscript, что делать с ее содержимым. - person Super Cat; 27.06.2017
comment
Господи, кто знает, о чем я тогда думал, @SuperCat. Текущие стандарты подразумевают, что textContents элемента noscript должен быть доступным (хотя включение определенного содержимого может быть ошибкой проверки); что они подразумевали 6 лет назад, у меня нет сил догадываться. Я все еще думаю, что это хитрое место для хранения чего-либо важного, но теперь оно кажется менее опасным; Я переделаю заметку. - person Shog9; 27.06.2017

Я не уверен насчет прототипа, но это работает в Chrome с jQuery:

$('noscript').before($('noscript').text());
person kingjeffrey    schedule 08.06.2011
comment
Я успешно использовал это с IE9, FF9 и Chrome 16.0.912.77. Придется использовать обходной путь для IE8 (и, возможно, ранее), в моем случае, для извлечения содержимого по текущему URL-адресу через AJAX для вставки во вкладку пользовательского интерфейса jQuery, поскольку фактический контент с вкладками из некорневого URL-адреса обслуживается. в теге noscript по умолчанию для полного запроса только содержимое вкладки в запросе AJAX. - person tvanfosson; 27.01.2012

Из спецификации HTML 4.0:

Элемент NOSCRIPT позволяет авторам предоставлять альтернативное содержимое, когда сценарий не выполняется. Содержимое элемента NOSCRIPT должно отображаться только с помощью пользовательского агента, поддерживающего сценарии, в следующих случаях:

  • Пользовательский агент настроен не оценивать скрипты.
  • Пользовательский агент не поддерживает язык сценариев, вызываемый элементом SCRIPT ранее в документе.

Мне кажется, это подразумевает, что все содержимое тега NOSCRIPT (в данном случае ваш div) вообще игнорируется, если в браузере включено скриптование. Вы убедились, что пример div вообще доступен через DOM в вашем случае?

person CloudyMusic    schedule 07.03.2009
comment
Я действительно проверил это (см. Мой ответ) - div не находится в DOM. - person Alnitak; 07.03.2009

Тестирование с Firefox 3.0.7, Safari 3.2.2 и MSIE 7.0.5730.13 (все на WinXP SP3) показало, что все, что находится внутри тегов <noscript>, полностью исключено из дерева DOM.

Однако можно получить доступ к самому элементу <noscript>, а затем использовать методы DOM для изменения его дочерних элементов.

person Alnitak    schedule 07.03.2009
comment
Два других не пробовал, но FF3.0.7 предоставляет содержимое через textContent. - person Shog9; 07.03.2009

Попробуйте $($("noscript").text()) с jQuery.

person sibidiba    schedule 18.08.2012
comment
Это интересно и полезно для извлечения обычного текста. но Sizzle (1.9.1) выдает ошибку нераспознанного выражения, если вы пытаетесь получить любую разметку с помощью тегов. - person Ben; 19.03.2013