2009-04-30 4 views
4

テキストがフレーム(またはiframe)の1つに含まれる場合、HTML文書で選択したテキストを見つける方法はありますか?HTML文書でiframeまたは単なるフレームを含む選択を見つける方法

文書が、それは簡単です何のフレームを持っていない場合:

var text; 
if (document.getSelection) { 
// Firefox and friends 
text = document.getSelection(); 
} else if (document.selection) { 
// IE 
text = document.selection.createRange(); 
} 
if (text == undefined || text == '') { 
// Iterate over all textarea elements and see if one of them has selection 
var areas = document.getElementsByTagName('textarea'); 
for(var i = 0; i = areas.length; i++) { 
    if(areas[i].selectionStart != undefined && 
    areas[i].selectionStart != areas[i].selectionEnd){ 
    text = areas[i].value.substring(areas[i].selectionStart, a[i].selectionEnd); 
    break; 
    } 
} 
} 
// Now if document has selected text, it's in text 

だから、これはクロスブラウザ(ない非常にきれいなが)動作します。

問題は、ドキュメントにフレームまたはiframeが含まれている場合です。 フレームには独自のドキュメントがあるため、上記のコードを使用するだけでは十分ではありません。 フレームツリーを繰り返し処理し、その中の選択されたテキストを検索する可能性がありますが、一般的にフレームには異なるドメインのコンテンツが含まれる可能性があるため、すべてのフレームやルート文書のすべてのサブフレームなどを選択されたテキストの検索私はHTMLにアクセスする許可を持っていなかったでしょうか?だから私は選択されたテキストを手に入れることができません。

ページにフレームが含まれていても、選択したテキストをWebページに見つける信頼できる方法がありますか?

おかげ

答えて

3

は、もう少し調査をした後、自分の質問に答えるために:フレームは異なるドメインである場合、あなたは自分のDOMにアクセスする権限がありませんので、 だから、あなたがそれについてできることは何がありません。しかし、すべてのフレームが同じドメインにある一般的なケース(たとえばgmail)では、テーマをすべてツリーのように繰り返すだけです。ここにいることを実現するコードです:自分の質問への優秀な答え@Ran

javascript:(function(){ 
    // Function: finds selected text on document d. 
    // @return the selected text or null 
    function f(d){ 
    var t; 
    if (d.getSelection) t = d.getSelection(); 
    else if(d.selection) t = d.selection.createRange(); 
    if (t.text != undefined) t = t.text; 
    if (!t || t=='') { 
     var a = d.getElementsByTagName('textarea'); 
     for (var i = 0; i < a.length; ++i) { 
     if (a[i].selectionStart != undefined && a[i].selectionStart != a[i].selectionEnd) { 
      t = a[i].value.substring(a[i].selectionStart, a[i].selectionEnd); 
      break; 
     } 
     } 
    } 
    return t; 
    }; 
    // Function: finds selected text in document d and frames and subframes of d 
    // @return the selected text or null 
    function g(d){ 
    var t; 
    try{t = f(d);}catch(e){}; 
    if (!t || t == '') { 
     var fs = d.getElementsByTagName('frame'); 
     for (var i = 0; i < fs.length; ++i){ 
     t = g(fs[i].contentDocument); 
     if(t && t.toString() != '') break; 
     } 
     if (!t || t.toString() == '') { 
     fs = d.getElementsByTagName('iframe'); 
     for (var i = 0; i < fs.length; ++i){ 
      t = g(fs[i].contentDocument); 
      if(t && t.toString() != '') break; 
     } 
     } 
    } 
    return t; 
    }; 
    var t= g(document); 
    if (!t || t == '') alert('please select some text'); 
    else alert('Chars: '+t.toString().length+'\nWords: '+t.toString().match(/(\S+)/g).length); 
})() 
0

次のコードは、選択したテキストの文字や単語をカウントブックマークレットです。ただし、iframeドキュメントが未定義の場合、関数は失敗します。私はこれをチェックする条件を追加しました。今はGmailを含めて試したすべてのサイトで動作します。 if ((!t || t == '') && d)素晴らしいコードをもう一度おねがいします。

var getSelectedText = function(){ 
    // Function: finds selected text on document d. 
    // @return the selected text or null 
    function f(d){ 
    var t; 
    if (d.getSelection) t = d.getSelection(); 
    else if(d.selection) t = d.selection.createRange(); 
    if (t.text != undefined) t = t.text; 
    if (!t || t=='') { 
     var a = d.getElementsByTagName('textarea'); 
     for (var i = 0; i < a.length; ++i) { 
     if (a[i].selectionStart != undefined && a[i].selectionStart != a[i].selectionEnd) { 
      t = a[i].value.substring(a[i].selectionStart, a[i].selectionEnd); 
      break; 
     } 
     } 
    } 
    return t; 
    }; 
    // Function: finds selected text in document d and frames and subframes of d 
    // @return the selected text or null 
    function g(d){ 
    var t; 
    try{t = f(d);}catch(e){console.log('ERROR: ',e);}; 
    if ((!t || t == '') && d){ 
     var fs = d.getElementsByTagName('frame'); 
     for (var i = 0; i < fs.length; ++i){ 
     t = g(fs[i].contentDocument); 
     if(t && t.toString() != '') break; 
     } 
     if (!t || t.toString() == '') { 
     fs = d.getElementsByTagName('iframe'); 
     for (var i = 0; i < fs.length; ++i){ 
      t = g(fs[i].contentDocument); 
      if(t && t.toString() != '') break; 
     } 
     } 
    } 
    return t; 
    }; 
    var t= g(document); 
    if (!t || t == '') ; 
    else return t.toString(); 
} 
関連する問題