使用Prototype </script>从innerHTML中剥离<script>标记

时间:2009-10-30 12:19:06

标签: javascript dom prototypejs

使用Prototype,我试图从DOM中提取一段文本 - 这通常是一个简单的$().innerHTML作业,但HTML会稍微嵌套。

<td class="time-record">
    <script type="text/javascript">
    //<![CDATA[
    document.write('XXX ago'.gsub('XXX', i18n_time_ago_in_words(1229311439000)));
    //]]>
    </script>
    about 11 months ago by <span class="author"><strong>Justin</strong></span>
</td>

在这种情况下,innerHTML会选择JavaScript,这将导致各种问题。

在没有JavaScript的情况下提取about 11 months ago by <span class="author"><strong>Justin</strong></span>最佳/最有效/最快方式是什么?

2 个答案:

答案 0 :(得分:5)

使用innerHTML,然后通过stripScripts

运行
var html = $$('td.time-record')[0].innerHTML.stripScripts()

这对于获取单个单元格的html非常有用。对所有td.time-record元素执行相同操作的更通用的解决方案是:

$$('td.time-record').pluck('innerHTML').invoke('stripScripts');

会返回一个每个单元格的html数组(删除<script>个元素),然后您可以.join('')或迭代。

答案 1 :(得分:1)

我不使用Prototype的stripScriptsstripTags,因为它们是琐碎的,天真的正则表达式黑客,它们无法正确处理所有可能的标记结构。对于像这样的简单情况,你可以使用stripScripts,但是使用这些函数来解决任何安全问题都是错误的。

我个人只是在使用innerHTML之前从DOM中删除了脚本元素。执行内联脚本后,您无需在文档中保留HTMLScriptElement。

$$('.time-record script').invoke('remove');
相关问题