繁体   English   中英

在dom元素中插入span而不覆盖子节点?

[英]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"]是注释的最后一个字符的位置

请注意, startend不考虑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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM