我的最终目标是让用户能够:
- 从段落中选择文本
- 将文本包装在一个跨度中
- 在选择的末尾放置一个操作按钮/ div,他们可以单击以采取进一步的操作
到目前为止,这是我的代码:
function Discussion(){
var $this = this;
$(document).bind("mouseup",function(){
$this.selectText($this);
});
}
Discussion.prototype.selectText = function($this){
var selection = $this.getSelectedText();
if(selection.length > 3){
console.log(selection);
var spn = '<span class="selected">' + selection + '</span>';
$(this).html($(this).html().replace(selection, spn));
//ERROR here; it says that it can't replace() on undefined $(this).html()
}
}
Discussion.prototype.getSelectedText = function(){
if(window.getSelection){
return window.getSelection().toString();
}
else if(document.getSelection){
return document.getSelection();
}
else if(document.selection){
return document.selection.createRange().text;
}
}
如您所料,到目前为止,我可以使用window.getSelection().toString()
. 如果我删除.toString()
,我会得到一个Selection
对象。有了这个,我可以window.getSelection().anchorNode.parentNode
用来获取我需要的大部分信息。
我也看到了这一点Selection.anchorOffset
,Selection.extentOffset
并将给我我选择的字符范围。有没有办法可以使用这些信息来放置跨度?
我想我的问题是:
- 为什么这段代码不将选择包装在 div 中?
- 这会因同一文本的多个实例而失败吗?
- 在用 span 或 inline-block div 或其他东西包装选择之后,我能否获得(并使用)它的位置来定位额外的按钮/div?
唷,谢谢你的时间!
编辑:我在这里添加了一个 JS 小提琴:http: //jsfiddle.net/nn62G/