![](/img/trans.png)
[英]I want to make a HTML text editor having bold functionality using window.getSelection
[英]window.getSelection() gives me the selected text, but I want the HTML
我正在擴展 WYSIWYG HTML 編輯器(用於 Firefox),我想在選擇周圍添加標簽。 我在Mozilla Midas 規范中找不到實現此功能的功能。
有一個命令可以用 HTML 替換選擇。
因此,如果我可以閱讀選擇內容,我可以將我的標簽添加到該字符串中。
window.getSelection()
幾乎可以工作,但它給了我nsISelection
轉換為純文本字符串。
PS: document.getSelection()
返回純文本字符串,甚至不返回nsISelection
。
看看DOM Range 規范。 您可以使用以下方法從 Firefox 中的用戶選擇中獲取Range
:
var range = window.getSelection().getRangeAt(0);
請注意,包括 Firefox 在內的某些瀏覽器允許多選,可以通過選擇的getRangeAt()
方法訪問。
Range
以 DOM 節點和這些節點內的偏移量表示。 一旦你有了Range
,就不能簡單地做你想做的事,因為范圍的邊界可能在 DOM 樹的不同級別的不同節點中,所以簡單地用標簽包圍 Range 的內容並不總是可能的。 您可能可以執行以下操作,盡管它會創建一個新的塊元素來包含所選內容:
var range = window.getSelection().getRangeAt(0);
var selectionContents = range.extractContents();
var div = document.createElement("div");
div.style.color = "yellow";
div.appendChild(selectionContents);
range.insertNode(div);
另一種,hacky,替代方法是使用document
的execCommand()
方法來修改選擇(例如,通過將其設置為特定顏色),然后使用document.querySelectorAll
或某些選擇器庫來選擇具有該顏色的元素,然后將樣式應用於他們。
Tim Down 的答案是正確的。 然而,一個問題是 extractContents() 將從 dom 中刪除選擇。 您可以使用
window.getSelection().getRangeAt(0).cloneContents();
只是獲取所選內容的副本。 然后你可以用你的新標簽包裝它,然后用它替換選擇。 Tim Down 對跨越多個 HTML 元素的范圍的擔憂當然是有道理的。 我認為一旦你得到范圍,它就會“修復”html,但是當你把它放回去時,它可能會導致問題。 這是 Range 對象的一個很好的資源。
window.getSelection() 將返回一個對象。 您可以通過調用 objects .toString() 方法將返回的選擇對象用作字符串。
var selObj = window.getSelection();
var selectedText = selObj.toString();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>select content of particular element</title>
</head>
<body>
<div id="div">This is the div tag</div>
<p>this is the paragraph</p>
<button id="Btn">Button</button>
<script>
let Btn = document.getElementById("Btn");
Btn.addEventListener("click", function () {
let selection = document.getSelection();
if (selection.anchorNode.parentElement.id == "div") {
let selectionContents = document.getSelection().toString();
console.log("selected content of div id :", selectionContents)
}
else{
console.log("pls select some text")
}
})
</script>
</body>
</html>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.