簡體   English   中英

Javascript在內存中的元素上而不是在dom中創建選擇

[英]Javascript create selection on element in memory, not in dom

我一直在嘗試使用JS中的選擇和范圍,並且對編寫與此相關的一些測試腳本很感興趣。 例如,查看contentEditables,我想編寫測試以顯示execCommand生成的標記如何與可編輯容器中已有的其他標記交互。

假設我有一個像這樣的文件:

<html>
  <body>
    <p id="test">Hello World</p>
  </body>
</html>

現在,我可以像這樣通過編程方式選擇“ Hello”:

p = document.getElementById('test');
r = document.createRange();
r.setStart(p.firstChild,0);
r.setEnd(p.firstChild,5);
s = window.getSelection();
s.removeAllRanges();
s.addRange(r);

我可以運行execCommand或其他需要對此進行選擇的東西,所以一切都很好。 但是,似乎我不能僅針對在內存中創建的元素執行此操作。 例如:

p = document.createElement('p');
p.innerText = "Hello World";
r = document.createRange();
r.setStart(p.firstChild,0);
r.setEnd(p.firstChild,5);
s = window.getSelection();
s.removeAllRanges();
s.addRange(r);

這不再起作用。 r.toString()將返回"Hello" ,但在s.addRange(r)s.rangeCount將返回0

為了測試對選擇項進行操作的功能,最好能夠創建一個元素,進行選擇,運行該函數並將結果與​​預期輸出進行比較,而無需在DOM中添加和刪除元素。為了測試它們。

我猜測問題的一部分是選擇不想接受不在DOM內的范圍。 MDN暗示 window.getSelection()不是創建選擇對象的唯一方法...

Selection是window.getSelection() 和其他方法返回的對象的類。

...但是它沒有提供有關如何創建這些對象或是否可以在內存對象中創建選擇的更多信息。

有沒有更好的方法可以解決我所忽略的問題,或者有一些已知的解決方法?

不,您必須將元素添加到DOM中才能進行選擇。 太可惜了:我想避免在Rangy的功能測試中違反DOM,但不能這樣做,因此要處理一些錯誤。

幾年前,WHATWG郵件列表上有一個相關主題。 我認為沒有任何結果。

http://lists.w3.org/Archives/Public/public-webapps/2012JanMar/0159.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM