请参阅此演示(取决于目前仅在 Chrome 中有效的选择更改事件):http://jsfiddle.net/fyG3H/
选择一些 lorem ipsum 文本,然后聚焦文本输入。在控制台日志中,您将看到有一个 DOMSelection 对象。
它的anchorNode值为HTMLBodyElement
虽然它应该有其中之一Text
.
在我尝试对选择对象进行字符串化之前,我不知道为什么会发生这种情况:http://jsfiddle.net/fyG3H/1/
这会产生以下错误:
未捕获的类型错误:将循环结构转换为 JSON
你知道如何防止 window.getSelection() 引起的循环引用吗?
EDIT
新的演示也适用于其他浏览器,但仍然给出错误的锚节点:http://jsfiddle.net/fyG3H/5/
并使用 JSON.stringify:http://jsfiddle.net/fyG3H/6/
Firefox 似乎返回一个空的 {} 而不是抛出错误。
你需要调用toString()
on getSelection()
. I've 更新了你的小提琴表现得如你所期望的那样。
var selection;
$('p').bind('mouseup', function() {
selection = window.getSelection().toString();
});
$('input').bind('focus', function() {
this.value = selection;
console.log(selection);
});
See demo
EDIT:
您没有获得正确的锚节点的原因是DOMSelection
对象通过引用传递,当您关注输入时,选择将被清除,从而返回与无选择相对应的选择默认值。解决这个问题的一种方法是克隆DOMSelection
对象的属性并引用该对象。你不会有原型DOMSelection
方法不再多,但根据您想要执行的操作,这可能就足够了。
var selection, clone;
$('p').bind('mouseup', function() {
selection = window.getSelection();
clone = {};
for (var p in selection) {
if (selection.hasOwnProperty(p)) {
clone[p] = selection[p];
}
}
});
$('input').bind('focus', function() {
console.dir(clone);
});
See demo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)