2011-07-30 11 views
1

が(のみ、この瞬間にChromeで動作しますSelectionChangeイベントに依存して)このデモを参照してください:http://jsfiddle.net/fyG3H/防止JavaScriptのwindow.getSelection()循環参照

は、いくつかのLoremのイプサムのテキストを選択し、テキスト入力を集中します。コンソールログには、DOMSelectionオブジェクトがあることがわかります。 anchorNodeの値はHTMLBodyElementですが、Textのいずれかにする必要があります。

これが起こった理由を私は選択オブジェクトをstringfyingしようとするまで、私は知りませんでした:http://jsfiddle.net/fyG3H/1/

これは、次のエラー得られます

Uncaught TypeError: Converting circular structure to JSON

をあなたは私がこの循環参照を防ぐことができる方法を知っていますwindow.getSelection()によって引き起こされる? http://jsfiddle.net/fyG3H/5/

そしてJSON.stringifyと:あまりにも他のブラウザで動作しますが、それでも、間違ったanchorNode与え

EDIT

新しいデモhttp://jsfiddle.net/fyG3H/6/

Firefoxは{空を返すように見えます}エラーをスローする代わりに。

+0

あなたのフィドルはjson2 JSライブラリが不足しています。 – Mrchief

+1

JSONはECMAScript 5のネイティブオブジェクトです。ライブラリを含める必要はありません。 – DADU

+0

本当ですか?そして、私たちはどれくらい多くのブラウザがそれをサポートしているのか知っています...そうではありませんか? – Mrchief

答えて

2

getSelection()toString()を呼び出す必要があります。私はupdated your fiddleあなたが期待するように振る舞いました。

var selection; 

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

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

See demo


EDIT:

あなたがに焦点を当てたときに正しいアンカーノードを取得していない理由は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); 
}); 

See demo

+0

ありがとうございます。選択オブジェクトから文字列を作成することにより、オブジェクトが失われてしまい、適切な解決策ではありません。 – DADU

+0

それから、内容を必要とするときは常に 'getSelection()'を格納し、 'toString()'を呼び出します。 – mVChr

+0

getSelection()を格納することは、私がデモ(http://jsfiddle.net/fyG3H/5/)で行っていることとまったく同じです。 – DADU