[英]Insert span in a dom element without overwrite child nodes?
我有一篇HTML文章,其中包含一些我可以通过SPARQL查询检索的注释。 这些批注指的是文档中的某些文本,我必须突出显示此文本(将其包装在一个跨度中)。
我已经问过如何在跨度中包装文本,但是现在我有一个更具体的问题,我不知道该如何解决。 我写的代码是:
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);
}
}
除了执行所有这些操作,您还可以使用$(el).append()
或$(el).prepend()
插入<span>
标签!
$("#k673f4141ea127b").append('<span class="annotation">2003</span>');
或者,如果我理解正确,您想用span.annotation
包装最后的2003
吗? 如果是这样,您可以执行以下操作:
$("#k673f4141ea127b").contents().eq(1).wrap('<span class="annotation" />');
$(document).ready(function() { $("#k673f4141ea127b").contents().eq(1).wrap('<span class="annotation" />'); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p class="metadata-entry" id="k673f4141ea127b"> <span class="generated" id="bcf5791f3bcca26">Publication date (<span class="data" id="caa7b9266191929">collection</span>): </span> 2003 </p>
最后,我的解决方案是在这个小提琴中。
归纳:
var element = document.getElementById(id);
var totalText = element.textContent;
var toFindText = totalText.substring(start,end);
var toReplaceText = "<span class='annotation'>"+toFindText+"</span>";
element.innerHTML = element.innerHTML.replace(toFindText, toReplaceText);
希望它可以帮助别人。
注意:这不会检查两个或更多注释是否指向同一个节点,我现在正在研究它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.