2012-04-12 48 views
1

我正在选择一个单词并尝试用元素结构替换它。之前我使用的是IE=EmulateIE7,下面的代码正在工作。由于其他一些问题,我删除了仿真IE7元,下面的insertNode停止工作。Rangy和InsertNode问题

function updateNodeAtRange(text, frag) { 
    var range = getFirstRange(); 
var htmlcontent='<span id="AuniqueId" class="style1">'+frag+'</span><span id="BuniqueId" class="style2">'+text+'</span>'; 
if (range) { 
    rangy.getSelection().deleteFromDocument(); 
    var el = document.createElement("new_update"); 
    el.setAttribute('id', 'CuniqueId'); 
    el.appendChild(document.createTextNode(text)); //Not sure if this is right 
    el.innerHTML = htmlcontent; 
    range.insertNode(el); 
    rangy.getSelection().setSingleRange(range); 
} 
alert(document.getElementById('Filearea').innerHTML); 
} 

new_update元素并不是必需的,但它在此阶段起作用。也可以使用document.createDocumentFragment()来代替innerHTML?那我该如何插入那个位置?

回答

1

我假设getFirstRange()来电rangy.getSelection().getRangeAt(0)

一个问题是你的文本节点被下面的行消灭了,但没有更多的继续(一个演示页面将是理想的),不可能说出主要问题是什么。一种可能性是range已被deleteFromDocument()调用更改。我会建议得到从选择一个新的范围将节点插入前:

function updateNodeAtRange(text, frag) { 
    var sel = rangy.getSelection(); 
    if (sel.rangeCount > 0) { 
     var htmlcontent='<span id="AuniqueId" class="style1">' 
      +frag+'</span><span id="BuniqueId" class="style2">' 
      +text+'</span>'; 
     sel.deleteFromDocument(); 
     var el = document.createElement("new_update"); 
     el.setAttribute('id', 'CuniqueId'); 
     el.innerHTML = htmlcontent; 
     var range = sel.getRangeAt(0); 
     range.insertNode(el); 
     sel.setSingleRange(range); 
    } 
    alert(document.getElementById('Filearea').innerHTML); 
} 
+0

我改变了'rangy.getSelection()deleteFromDocument()''到range.deleteContents();'它工作得很好。 – Dominic 2012-04-12 10:13:09

+0

@Dominic:是的,那也可以。 – 2012-04-12 14:35:17