2009-04-30 9 views
4

Gibt es eine Möglichkeit, den ausgewählten Text in einem HTML-Dokument zu finden, wenn sich der Text in einem seiner Frames (oder Iframes) befindet?So finden Sie eine Auswahl in einem HTML-Dokument, das iframe oder nur Frames enthält

Wenn das Dokument keine Frames hat es einfach:

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 

So funktioniert die Cross-Browser (wenn auch nicht sehr hübsch).

Das Problem liegt vor, wenn das Dokument Frames oder Iframes enthält. Frames haben ein eigenes Dokument, also reicht es nicht, den obigen Code zu verwenden. Man könnte möglicherweise über die Frames-Struktur iterieren und in einem von ihnen nach ausgewähltem Text suchen, aber im Allgemeinen können Frames Inhalte von verschiedenen Domains haben, selbst wenn ich über alle Frames und über alle Subframes usw. des Root-Dokuments in iterieren würde Suche nach ausgewähltem Text Ich hätte nicht die Erlaubnis gehabt, auf ihren HTML zuzugreifen, oder? Ich wäre also nicht in der Lage, den ausgewählten Text zu bekommen.

Gibt es eine (einfache) zuverlässige Möglichkeit, den ausgewählten Text auf einer Webseite zu finden, selbst wenn die Seite Frames enthält?

Dank

Antwort

3

Um meine eigene Frage, nach etwas mehr Untersuchung zu beantworten: Also, wenn Rahmen unterschiedlicher Domänen sind dann gibt es nichts, was man tun kann, da Sie keine Berechtigung Zugriff auf ihre dom haben. Im allgemeinen Fall, in dem alle Frames auf der gleichen Domain (z. B. Google Mail) sind, wird das Thema jedoch alle wie ein Baum iteriert. Hier ist der Code, wird erreicht, daß:

Der folgende Code für ein Bookmarklet ist, die Zeichen und Wörter des ausgewählten Textes zählt:

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

@Ran Ausgezeichnete Antwort auf Ihre eigene Frage. Wenn das Iframe-Dokument jedoch nicht definiert ist, schlägt die Funktion fehl. Ich habe eine Bedingung hinzugefügt, um dies zu überprüfen, jetzt funktioniert es auf jeder Seite, die ich versucht habe, einschließlich Gmail. if ((!t || t == '') && d) Danke nochmal für den tollen Code.

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(); 
}