【发布时间】:2015-01-27 00:44:10
【问题描述】:
我有一篇带有一些注释的 HTML 文章,我使用 SPARQL 查询检索这些注释。这些注释引用了文档中的一些文本,我必须突出显示这些文本(将其包裹在一个 span 中)。
我已经问过如何在跨度中换行,但现在我有一个更具体的问题,我不知道如何解决。 我写的代码是:
var currentText = $("#"+v[4]["element"]+"").text();
var newText = currentText.substring(0, v[5]["start"]) + "<span class=' annotation' >" + currentText.substring(v[5]["start"], v[6]["end"]) + "</span>" + currentText.substring(v[6]["end"], currentText.length);
$("#"+v[4]["element"]+"").html(newText);
地点:
v[4]["element"]是注解的父元素的id
v[5]["start"]是注解第一个字符的位置
v[6]["end"]是注解最后一个字符的位置
请注意,start 和 end 不考虑 html 标签。
事实上我的错误在于使用text()方法从节点中提取数据(以便能够回到注释的正确位置)并使用html()方法放回去;但是这样如果父节点有子节点,它们就会丢失并被简单的文本覆盖。
示例: 在“2003”上有注释
<p class="metadata-entry" id="k673f4141ea127b">
<span class="generated" id="bcf5791f3bcca26">Publication date (<span class="data" id="caa7b9266191929">collection</span>): </span>
2003
</p>
变成:
<p class="metadata-entry" id="k673f4141ea127b">
Publication date (collection):
<span class="annotation">2003</span>
</p>
我认为我应该使用节点而不是简单地提取和重写内容,但我不知道如何在不考虑 html 标记和不消除子元素的情况下确定插入注释的确切点。
我阅读了一些关于 jQuery .contents() 方法的内容,但我不知道如何在我的代码中使用它。
谁能帮我解决这个问题?谢谢你
编辑:添加 php 代码以提取页面正文。
function get_doc_body(){
if (isset ($_GET ["doc_url"])) {
$doc_url = $_GET ["doc_url"];
$doc_name = $_GET ["doc_name"];
$doc = new DOMDocument;
$mock_doc = new DOMDocument;
$doc->loadHTML(file_get_contents($doc_url.'/'.$doc_name));
$doc_body = $doc->getElementsByTagName('body')->item(0);
foreach ($doc_body->childNodes as $child){
$mock_doc->appendChild($mock_doc->importNode($child, true));
}
$doc_html = $mock_doc->saveHTML();
$doc_html = str_replace ('src="images','src="'.$doc_url.'/images',$doc_html);
echo($doc_html);
}
}
【问题讨论】:
-
您必须遍历所有文本节点。对于每个文本节点,使用单词作为分隔符将其拆分。迭代结果并生成一个文本节点,如果字符串不是单词和 span 元素,则它是一个。在原始文本节点之前插入新闻节点。最后删除原始文本节点。
-
抱歉,我没能很好地理解您的回答,能否给我一个简短的 sn-p 应用于我的示例中的
<p>元素? -
并非如此,这就是为什么这是评论,而不是答案。你需要以不同的方式开始。不要匹配元素节点并获取它们的“文本”,而是直接获取文本节点。文本节点包含您要突出显示的单词,需要用新节点替换。几年前我在 PHP 中实现了这个......
标签: javascript jquery html dom nodes