2012-05-29 62 views
0

當在另一個元素(pipe |是插入符號位置)的開始處嘗試在空元素之前插入一個節點時,我注意到了這個問題。與此開始:使用JavaScript在Chrome中的空節點前插入節點Rangy

<p>|<span />Some text</p> 

我用range.insertNode()在四肢瘦長範圍粘貼一些文字,但在Chrome中我看到這個結果,其中空<span>後的新節點出現:

<p><span />|INSERTED TEXTSome text</p> 

而不是這樣的:

<p>|INSERTED TEXT<span />Some text</p> 

注意,這似乎在IE9中正常工作,如果不將INSERT在<p>節點它也可以在人權委員會開始進行青梅,例如:

<p>Some |<span />text</p> 

結果:

<p>Some |INSERTED TEXT<span />text</p> 

這是一個簡單的例子,但說明我看到的問題。

爲了澄清(在情況下,我處理這個錯誤的方式有人能提出一種替代),我試圖插入文本,並始終將光標定位在新插入的文本的末尾出現一次插入完成。

E.g. <p>|Original Text</p>應該成爲<p>INSERTED TEXT|Original Text</p>

然而,插入在插入符的節點正在結果立即放置在插入的文本之前(這是作爲文檔指出它應該是爲插入節點,所以沒有抱怨那裏)。我試圖使用空的<span>作爲插入符後恢復插入位置的標記(事實上,我正在使用Rangy的選擇保存和恢復模塊來爲我做)。

回答

1

這是因爲WebKit不認爲<span>之前的位置是有效的插入位置。它涉及到這些的Webkit漏洞:

如果範圍如您所願,四肢修長將允許你插入你想要的節點,但如果你有範圍從選擇範圍將反映瀏覽器的選擇的想法。可能有辦法解決這個問題,但我並不清楚你想要做什麼。

+0

更新了我的問題並做了一些說明。我想我明白你對範圍的看法 - 我正在選擇範圍。是否有一種簡單的方法可以問Rangy'你是否在保存/恢復標記之後,當你應該在它之前'? – Jason

+0

@Jason:有很多種方法可以做到這一點。在我看來,你不需要保存和恢復步驟,可以只是做'var node = document.createTextNode(「INSERTED TEXT」); var sel = rangy.getSelection(); sel.getRangeAt(0).insertNode(節點); sel.collapse(node,node.length);' –

+0

啊,是的,這似乎是要走的路。由於插入的「文本」實際上可以是html,即「Line 1
Line 2」,所以我在實際實現中增加了一些複雜性。起初我並不認爲這會是一個問題,但現在我明白了。 – Jason