【问题标题】:Access Contents of <noscript> with Javascript使用 Javascript 访问 <noscript> 的内容
【发布时间】:2010-10-11 21:02:57
【问题描述】:
<noscript><div id="example">I want to get this innerHTML</div></noscript>

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

这个 javascript sn-p 只返回一个空字符串。有没有办法获取 noscript 节点的内容?

附言我正在这个特定项目中使用原型。

【问题讨论】:

  • 用 jQuery 试试 $($("noscript").text())。
  • 这个 ^ 确实有效。至少在 Chrome 32 中。

标签: javascript innerhtml noscript


【解决方案1】:

如果启用了脚本,the noscript element is defined as containing only text - 虽然它必须是可解析文本,但对内容有一些限制。考虑到这一点,您应该能够提取文本、解析它,然后找到您想要的元素。一个基本的例子如下:

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 上工作。
  • 用 jQuery 试试 $($("noscript").text())。
  • @Shog9 这么久了,你能澄清一下这个答案吗? in Google's Chrome, the noscript element has no children in the DOM - 如果我理解正确,您是说您当时正在测试的 Chrome 版本在启用 Javascript 时完全清空了 noscript 标记的内容,从而使其内部内容为空?如果属实,这似乎有点奇怪。我今天正在尝试实现类似的东西,但这让我想知道noscript 规范是否没有详细说明如何处理其内容。
  • 天哪,谁知道我当时在想什么,@SuperCat。当前标准意味着 noscript 元素的 textContents 应该 是可访问的(尽管包含某些内容可能是验证错误);他们在 6 年前暗示了什么,我没有精力去猜测。我仍然认为这是一个存放任何重要物品的危险地方,但现在它似乎不那么危险了。我会修改笔记。
【解决方案2】:

我不确定原型,但这适用于带有 jQ​​uery 的 Chrome:

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

【讨论】:

  • 我已经在 IE9、FF9 和 Chrome 16.0.912.77 上成功使用了它。在我的情况下,必须使用 IE8(可能更早)的解决方法来通过 AJAX 检索当前 URL 的内容以插入到 jQuery UI 选项卡中,因为来自非根 url 的实际选项卡式内容已提供对于完整请求,默认情况下在 noscript 标记中,只有 AJAX 请求上的选项卡内容。
【解决方案3】:

来自HTML 4.0 spec

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

  • 用户代理配置为不评估脚本。
  • 用户代理不支持由文档前面的 SCRIPT 元素调用的脚本语言。

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

【讨论】:

  • 我已经实际测试过了(见我的回答)- div 不在 DOM 中。
【解决方案4】:

使用 Firefox 3.0.7、Safari 3.2.2 和 MSIE 7.0.5730.13(均在 WinXP SP3 上)进行测试,似乎 &lt;noscript&gt; 标记中的所有内容都从 DOM 树中完全省略了。

但是,可以访问&lt;noscript&gt; 元素本身,然后使用 DOM 方法更改其子元素。

【讨论】:

  • 其他两个没试过,但是FF3.0.7通过textContent暴露了内容。
【解决方案5】:

用 jQuery 试试 $($("noscript").text())。

【讨论】:

  • 这很有趣,对于检索纯文本很有用。但是如果您尝试检索带有标签的任何标记,Sizzle (1.9.1) 会引发“无法识别的表达式”错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多