1

このデモを参照してください(現時点でChromeでのみ機能するselectionchangeイベントに依存します):http://jsfiddle.net/fyG3H/

いくつかのloremipsumテキストを選択してから、テキスト入力にフォーカスします。コンソールログに、DOMSelectionオブジェクトがあることがわかります。のanchorNode値がありますが、のHTMLBodyElementいずれかが必要ですText

選択オブジェクトを文字列化してみるまで、なぜこれが起こっているのかわかりませんでした:http: //jsfiddle.net/fyG3H/1/

これにより、次のエラーが発生します。

Uncaught TypeError:循環構造をJSONに変換しています

window.getSelection()によって引き起こされるこの循環参照を防ぐ方法を知っていますか?

編集

他のブラウザでも機能するが、それでも間違ったanchorNodeを提供する新しいデモ:http://jsfiddle.net/fyG3H/5/

そしてJSON.stringifyで:http://jsfiddle.net/fyG3H/6/

Firefoxは、エラーをスローする代わりに空の{}を返すようです。

4

1 に答える 1

2

で呼び出す必要がありtoString()ますgetSelection()。私はあなたのフィドルをあなたが期待するように振る舞うように更新しました。

var selection;

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

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

デモを見る


編集:

正しいアンカーノードを取得できない理由は、DOMSelectionオブジェクトが参照によって渡され、入力にフォーカスすると選択がクリアされ、選択がないことに対応する選択のデフォルトが返されるためです。これを回避する1つの方法は、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 に答える