在文本后添加HTML元素

在文本后添加HTML元素

问题描述:

我正在寻找一种使用JavaScript添加HTML元素的方法。但问题是新的元素可能在一些文本之间。在所有其他情况下,我使用insertBefore()方法。在文本后添加HTML元素

我正在使用以下函数来获取光标位置。 我最初的做法是分割目标innerHTML并添加必要的标签,但提供的光标位置不考虑字符转换,如空间到 。因此,如果存在多个连续空格,则光标位置将不会在innerHTML中给出核心位置。

function getCursorPos() 
{ 
var cursorPos=-1; 
if (window.getSelection) 
{ 
    var selObj = window.getSelection(); 
    var selRange = selObj.getRangeAt(0); 
    cursorPos = findNode(selObj.anchorNode.parentNode.childNodes, 
         selObj.anchorNode) + selObj.anchorOffset; 
/* FIXME the following works wrong in Opera when the document is longer than 32767 chars */ 
    } 
    else if (document.selection) 
    { 
     var range = document.selection.createRange(); 
     var bookmark = range.getBookmark(); 
/* FIXME the following works wrong when the document is longer than 65535 chars */ 
     cursorPos = bookmark.charCodeAt(2) - 11; /* Undocumented function [3] */ 

    } 

return cursorPos; 
} 

function findNode(list, node) 
{ 
    for (var i = 0; i < list.length; i++) 
    { 
     if (list[i] == node) 
     { 
      return i; 
    } 
    } 
    return -1; 
} 

有没有其他方法可以做到这一点? 新的元素可能在HTML的中间,即它可能并不总是在最后。

谢谢

+1

文本是DOM中的叶节点。所以最好的方法是刮出文本,获得父元素。删除子项(文本)添加新元素,在创建新文本节点后拆分文本(现在是字符串)和appendChild。 – Keith 2011-03-18 06:29:49

+0

对不起,但我没有得到你。 (“所以最好的方法是刮出文本,获取父元素”)。你是否建议使用光标位置来获取文本节点,将文本拆分为2,追加text1,newhtml,text2(按照该顺序)?但是如果在文本之前还有其他html元素作为childern呢? – 2011-03-18 07:39:58

+0

对于之前的评论我很抱歉,但是这个窍门。谢谢! – 2011-03-18 12:06:26

这是我使用的方法的一部分。它的工作原理,但我不知道是否有更好的方法。

function getCursorNode() 
{ 
if (window.getSelection) 
{ 
    var selObj = window.getSelection(); 
    return selObj.anchorNode; 
} 
} 

function splitTextNode(pos) 
{ 

selNode=getCursorNode(); 
if(selNode.nodeName=="#text") 
{ 
    var value=selNode.nodeValue; 
    if(value.length == pos) 
    { 
     return ({"node":selNode,"txt":value }); 
    } 
    else if(pos==0) 
    { 
     return ({"node":selNode,"txt":""}); 
    } 
    else 
    {       
     var splittxt1=value.slice(0,pos) 
     var tempsplit1=document.createTextNode(splittxt1); 

     var splittxt2=value.slice(pos) 
     var tempsplit2=document.createTextNode(splittxt2); 

     myInsertAfterMany([tempsplit1,tempsplit2],selNode); 
     child.parentNode.removeChild(selNode); 

     return ({"node":tempsplit1,"first":false,"txt":splittxt1}); 
    } 

} 

}

但是,它(getCursorNode)不能在IE浏览器。 现在,在检查“第一个”之后,我在“节点”之后附加了所需的节点。

你可以这样做:

var text = $("#container").html();//the target element has the id of container 

过程text现在,那就是分手text任何你想用它做,并在相关的HTML元素添加你想要的方式或在此text位置使用字符串添加。

然后做此...

$("#container").html(text); 

你也可以采取Keith的做法。认识他所说的很重要。另一种研究它的方法是在文本内插入一个dom元素(例如,html标签),这可能不适用于insertAfterinsertBefore

+0

据我所知,这会给我innerHTML的JavaScript等价物。那么,我将如何找到该HTML字符串的游标位置? – 2011-03-18 10:31:39

+0

@ Diff.Thinkr:您是否在尝试查找所选文本左上角的坐标?您的计算对于等宽字体 - 固定宽度的字体可能是正确的。但是,在大多数情况下,对于宽度各不相同的字体而言,这是不正确的。我认为你仍然可以为你的目的使用这个粗略的近似值。如果这不是问题,那么您能否详细阐述一下你试图实现的目标? – rayhan 2011-03-18 11:54:06