1

请参阅此演示(取决于此时仅在 Chrome 中有效的 selectionchange 事件):http: //jsfiddle.net/fyG3H/

选择一些 lorem ipsum 文本,然后聚焦文本输入。在控制台日志中,您将看到有一个 DOMSelection 对象。它有一个 anchorNode 值,HTMLBodyElement而它应该有一个Text

在我尝试对选择对象进行字符串化之前,我不知道为什么会发生这种情况:http: //jsfiddle.net/fyG3H/1/

这给出了以下错误:

未捕获的 TypeError:将循环结构转换为 JSON

您知道如何防止由 window.getSelection() 引起的这种循环引用吗?

编辑

新的演示也适用于其他浏览器,但仍然给出错误的锚节点:http: //jsfiddle.net/fyG3H/5/

并使用 JSON.stringify:http: //jsfiddle.net/fyG3H/6/

Firefox 似乎返回一个空的 {} 而不是抛出错误。

4

1 回答 1

2

您需要调用toString()on getSelection()。我已经更新了您的小提琴,使其行为符合您的预期。

var selection;

$('p').bind('mouseup', function() {
    selection = window.getSelection().toString();
});

$('input').bind('focus', function() {
   this.value = selection;
   console.log(selection); 
});

看演示


编辑:

您没有获得正确锚节点的原因是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); 
});

看演示

于 2011-07-31T17:16:06.203 回答