[英]Insert text before and after selection in textarea with javascript
[英]How to get the HTML before, inside, and after a selection (not in textarea)?
以下是我要完成的任務:當用戶使用鼠標,鍵盤或觸摸來選擇“myDiv”中的文本時,我想獲取三個謹慎的HTML塊:選擇之前的HTML(到它的“左側”) ),選擇內的HTML,以及選擇后的HTML(到它的“右邊”)。 html應該與myDiv.innerHTML一樣。
選擇可能在標記對內開始或結束(即,隔離的選擇不一定是有效的HTML)。 我不需要處理選擇中絕對定位元素之類的特殊場景; 我所關注的所有選擇都將被限制為一個包含基本標簽的div,例如strong,em,ul,ol,h1,image和table。
我最接近的是使用rangy來阻止選擇並調用selection.getRangeAt(0).cloneContents()
來獲取選擇HTML。 這種方法效果很好,直到我做出一個孤立無效的選擇,並且瀏覽器改變文檔片段的HTML以使其成為有效標記。
額外信息:這就是我需要這個的原因:
我正在創建一個文檔反饋系統,因此我需要將選擇信息保存到數據庫中以便以后檢索和重構。 通常我會使用DOM路徑和所選文本保存選擇,但文本可能會在保存和重建之間發生變化。 例如,作者可能會移動整個段落,刪除部分等。然后DOM路徑變得毫無用處。
所以我的(不完美)計划是將選擇存儲為[offset,length,html_snippet]。 那就是“位置”。 我還將存儲直接在所選文本之前和之后出現的html片段。 這是“背景”。
使用這些數據的組合,我應該能夠在大多數時間重新定位最初選擇的文本,即使它已移動或部分更改。 當失敗時,UI將有辦法解決它,但我希望盡可能不頻繁地發生。
Superthanks!
我有幾個問題:
1.-當你說'選擇后的html'時 - 那個html與選擇之前的html有什么不同,反之亦然? 由於你的“腳本”或其他什么,“選擇”過程本身是否篡改了html?
2.-你說文本選擇不是在textareas中發生的......那你使用的是什么元素? 段落? div的...? 縮小它會有所幫助。
3.-你有沒有想過使用jquery?
做點什么
$('#element_with_text_goes_here').select(function() {
//apply grabbing functions here, for example
//copy html 'before' selection:
$pre_html = $('html').clone();
// copy selection...see below:
// copy html 'after' selection'...same as before
});
復制選擇:
如上所述:
傑森寫了以下函數:
function selectText(element) {
var doc = document;
var text = doc.getElementById(element);
if (doc.body.createTextRange) { // ms
var range = doc.body.createTextRange();
range.moveToElementText(text);
range.select();
} else if (window.getSelection) { // moz, opera, webkit
var selection = window.getSelection();
var range = doc.createRange();
range.selectNodeContents(text);
selection.removeAllRanges();
selection.addRange(range);
}
}
通過現場工作演示可以在這里找到: http : //jsfiddle.net/edelman/KcX6A/339/
這里有一個jquery插件版本: http : //jsfiddle.net/edelman/KcX6A/340/
您可以使用哪個來獲取所選文本。 你只需要相應地調整它,因為他從一個反向角度接近它。 您可以給我們的詳細信息......我們可以提供更好的幫助。
希望這可以幫助
G
此代碼從用戶的選擇中獲取html / text,但它僅適用於IE。 該代碼也適用於交叉標記選擇。 (Globals用於保持代碼簡短。)
<script>
function selected(){
thediv=document.getElementById('div');
res=document.getElementById('htm');
userSelection=document.selection;
userRange=userSelection.createRange();
/* For wider scale of elements */
// rangeParent=userRange.parentElement();
// if(rangeParent!=thediv) userRange.moveToElementText(rangeParent);
rangeText=userRange.htmlText; // OR: rangeText=userRange.text;
res.innerText=rangeText;
return;
}
</script>
</head>
<body onload="document.onselectionchange=selected;">
<div id="div">
<h1>The great testpage</h1>
<p>A paragraph with some text</p>
<p>This paragraph <b>contains</b> a child element.</p>
<p>And this is the last paragraph.</p>
<table>
<tr><td>Cell1-1</td><td>cell1-2</td></tr>
<tr><td>Cell2-1</td><td>cell2-2</td></tr>
</table>
<ol>
<li>item1</li>
<li>item2</li>
<li>item3</li>
</ol>
</div>
<br>
<span id="htm"></span>
</body>
在thediv
選擇之前和之后的內容你會得到這樣的: prepost=thediv.innerHTML/innerText.split(rangeText);
如果頁面包含除了thediv
任何其他元素,則必須使它們不可選。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.