使用Javascript访问<noscript>标签的内容

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

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

这个Javascript片段只返回一个空字符串。有没有一种方法可以获取noscript节点的内容?

附注:我在这个项目中使用Prototype。


1
使用jQuery尝试 $($("noscript").text())。 - sibidiba
这个 ^ 是有效的。至少在 Chrome 32 中是这样的。 - Jazzy
5个回答

21
如果启用了脚本,则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内容似乎得到了更好的支持,但我仍然认为这是一个边缘案例,可能比其他元素更容易出现错误——如果您有其他选择,我建议避免使用它。

这在IE7(XP)上似乎不起作用。但它在IE6上可以工作。 - pixelastic
2
使用jQuery尝试 $($("noscript").text())。 - sibidiba
@Shog9 这么长时间过去了,你能否澄清一下这个答案的问题?“在Google的Chrome中,noscript元素在DOM中没有子元素”-如果我理解正确,你是说当时测试的Chrome版本在启用Javascript时完全清空了noscript标签的内容,从而使其内部内容为空?如果是真的,这似乎有点奇怪。我今天正在尝试实现类似的东西,但这让我想知道noscript规范是否没有详细说明如何处理其内容。 - Super Cat
1
老天啊,谁知道我当时在想什么,@SuperCat。当前标准意味着noscript元素的textContents应该是可访问的(尽管包含某些内容可能是验证错误); 他们6年前暗示的我没有精力去猜测。我仍然认为这是存储任何重要信息的不安全之地,但现在似乎少了危险;我会修改注释。 - Shog9

5

我不确定 prototype 是否也适用,但是这个方法可以在 Chrome 中和 jQuery 一起使用:

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

1
我已经成功地在IE9、FF9和Chrome 16.0.912.77上使用了这个。对于IE8(以及可能更早的版本),我不得不使用一个解决方法,通过AJAX检索当前URL的内容,并将其插入到jQuery UI选项卡中作为实际的选项卡内容。因为非根URL的选项卡内容默认情况下会在noscript标记中提供完整请求,只有在AJAX请求时才会提供选项卡内容。 - tvanfosson

3
使用Firefox 3.0.7、Safari 3.2.2和MSIE 7.0.5730.13(均在WinXP SP3上)进行测试,似乎

没有尝试过另外两个,不过FF3.0.7通过textContent公开了内容。 - Shog9

3

来自HTML 4.0规范

NOSCRIPT元素允许作者在脚本未执行时提供替代内容。 NOSCRIPT元素的内容只应在以下情况下由支持脚本的用户代理呈现:

  • 用户代理被配置为不评估脚本。
  • 用户代理不支持文档中早期SCRIPT元素调用的脚本语言。

我认为这意味着,如果浏览器启用了脚本,则忽略NOSCRIPT标记(在本例中为div)的全部内容。您是否验证了“示例”div在您的情况下是否可以通过DOM访问?


我已经测试过了(请看我的回答)- 这个 div 不在 DOM 中。 - Alnitak

2
使用jQuery尝试 $($("noscript").text())。

有趣的是,这对于检索纯文本非常有用。但是,如果您尝试检索带标记的任何标记,则 Sizzle(1.9.1)会抛出“未识别的表达式”错误。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接