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

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

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

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

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

Ответы

Ответ 1

Если сценарий включен, элемент 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 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-содержимому выглядит несколько лучше в наши дни, но он по-прежнему выглядит как крайний случай, который, возможно, несколько более вероятен, чем другие элементы, чтобы отображать ошибки - я бы избегал этого, если у вас есть другие параметры.

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

$('noscript').before($('noscript').text());

Ответ 5

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