在我强调了一个电子邮件地址后,我<div contentEditable="true">
无法将 Carot 设置为它所在的位置或应该在的位置。
它似乎跳到了Node的firstChild的开头,而不是跳出<strong>
右边的标签。
$('[contenteditable]').on("input", function() {
$this = $(this);
var re = /([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)\b)/gi;
//'
var result = $this.html().match(re) || [];
if (!result.compare(_emailArray) || result.length > _emailCount || result.length < _emailCount) {
var range = getCaretPos();
$this.html(function() {
var content = $this.html();
content = content.replace(/(<(\/*strong)>)/ig,"");
content = content.replace(re, "<strong>$1</strong>");
return content;
});
setCaretPos(range);
_emailCount = result.length;
_emailArray = result;
}
});
所以问题在于getCaretPos()
andsetCaretPos()
函数
function getCaretPos(){
var sel = window.getSelection();
var range = sel.getRangeAt(0);
return range;
}
function setCaretPos(range){
range = document.createRange();
range.setStart(range.startContainer,range.startOffset);
range.setEnd(range.endContainer,range.endOffset);
var sel = window.getSelection();
sel.addRange(range);
}
老实说,我并没有完全理解范围的概念。这就是我应该在这里使用的,对吧?这两个函数是从我找到的几个片段中拼凑在一起的。
有人可以解释范围甚至修复代码吗?顺便说一句,如果有人想将电子邮件地址包装在strong
标签中,而不是每次都对所有电子邮件地址都这样做,请告诉我!
我感谢任何建议、片段和想法。谢谢!