2011-01-27 11 views
1

私はブックマークレットを構築しています。ブックマークレットを作成して、選択したテキストを処理しているサーバーに送り返します。 Gmail以外のすべてのサイトで動作します。誰でもGmail上で動作させる方法を知っています。私が使用しているコードは次のとおりです。GmailのJSテキスト選択

var selectedText = ''; 
if (window.getSelection) { 
    selectedText = window.getSelection(); 
} else if (document.getSelection) { 
    selectedText = document.getSelection(); 
} else if (document.selection) { 
    selectedText = document.selection.createRange().text; 
} else { 
    selectedText = document.activeElement.contentWindow.getSelection(); 
}; 
+1

私はそれがなぜかについてコメントすることなくダウン投票した人には不自然だと感じています。良い質問コーナーと幸運。ゴシードは素晴らしい冒険のように聞こえる。 – sholsinger

+0

[これはもっと一般的な解決策です](http://stackoverflow.com/questions/808744/how-to-find-selection-in-html-document-that-c​​ontains-iframe-or-just-frames)フレーム内の選択されたテキストに対して機能します。 – Sport

答えて

2

私は同じ問題を打つと答え自分を探しているあなたの質問を発見しました。

私の知る限り、window.getSelectionはgmailでは定義されていませんが、getSelection()。toString()はテキストが選択されていても長さゼロの文字列を返します。 FirefoxでTim Downのソリューションは私のために働いたが、Chromeでは使用できないcontentWindowとしては機能しなかった。

Firefox、Chrome、Safariでページ内のフレームがGmailで動作していますが、以下の改訂されたコードは繰り返します。 (私は他のブラウザでそれをテストしていません)。

var selectedText = ''; 
if (window.getSelection) { 
    selectedText = window.getSelection().toString(); 
} 
if (selectedText == '') { 
    var frames = window.frames; 
    for (var i = 0; i < frames.length; i++) { 
    if (selectedText == '') { 
     selectedText = frames[i].document.getSelection().toString(); 
    } 
    else { break; } 
    } 
} 
+0

すばらしい解決策。あなたがプログラムで実証したように、親の_window_にあるテキスト選択に頼ることはできません。 – sholsinger

0

最後のケースはFirefoxのGmailでうまく動作します。そのコードといくつかの欠点は、しかしあります

  • window.getSelection()は(私はどこにでもこれを参照してください、私はそれがPPKのせいだと思う)Selectionオブジェクトではなく、文字列を返します。必要がありますselectedText = "" + window.getSelection();
  • 最後のケースはIE以外のブラウザではiframeをカバーしますがIEではカバーしません。 IEのdocument.activeElementがiframeを指すことができると私は思っています(しかし確信はありません)。

改訂コード:

var selectedText = ''; 
if (window.getSelection) { 
    selectedText = "" + window.getSelection(); 
} else if (document.getSelection) { 
    selectedText = document.getSelection(); 
} else if (document.selection) { 
    selectedText = document.selection.createRange().text; 
} else if (document.activeElement.contentWindow) { 
    var win = document.activeElement.contentWindow; 
    if (win.getSelection) { 
    selectedText = win.getSelection(); 
    } else if (win.document.selection) { 
    selectedText = win.document.selection.createRange().text; 
    } 
}; 
+0

Gmailのおかげで助けてくれてありがとうございます。 – conorwade

+0

@conorwade:ブラウザーのような詳細が必要です.Gmailを見たり、選択した場所を表示できます。 –

0

これは
コンテキストメニューの検索のためのFirefoxで使用されているFirefoxのクロムでbrowser.jsファイル内の関数getBrowserSelection()..私はGmailでのFirefox 3.6を使用してのために働い

var focusedWindow = document.commandDispatcher.focusedWindow; 
var selection = focusedWindow.getSelection(); 
関連する問題