使用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>
的最佳/最有效/最快方式是什么?
答案 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的stripScripts
或stripTags
,因为它们是琐碎的,天真的正则表达式黑客,它们无法正确处理所有可能的标记结构。对于像这样的简单情况,你可以使用stripScripts,但是使用这些函数来解决任何安全问题都是错误的。
我个人只是在使用innerHTML之前从DOM中删除了脚本元素。执行内联脚本后,您无需在文档中保留HTMLScriptElement。
$$('.time-record script').invoke('remove');