2009-09-24 12 views
17
<html> 
<body> 
    <script type="text/javascript"> 

    function smth() { 

    if (document.getSelection) { 
    var str = document.getSelection(); 
    if (window.RegExp) { 
     var regstr = unescape("%20%20%20%20%20"); 
     var regexp = new RegExp(regstr, "g"); 
     str = str.replace(regexp, ""); 
    } 
    } else if (document.selection && document.selection.createRange) { 
    var range = document.selection.createRange(); 
    var str = range.text; 
    } 

    alert(str); 
    } 
    </script> 

    <iframe id="my" width="300" height="225"> 
    .....some html .... 
    </iframe>  

    <a href="#" onclick="smth();">AA</a> 
</body>  
</html> 

z funkcją smth mogę uzyskać zaznaczony tekst z elementu div, ale nie działa on z ramką iframe. wszelkie pomysły na pobranie wybranego tekstu z elementu iframe?jak uzyskać zaznaczony tekst z elementu iframe za pomocą javascript?

Odpowiedz

6

Nie można uzyskać dostępu do danych wewnątrz domeny iframe pochodzącej z domeny innej niż Twoja. Jest to spowodowane Same origin policy.

+2

ok, przepraszam zły przykład, w iframe mam tekst, używam iframe do edytora WYSIWIG, więc nie jest na innej domenie. –

+0

Dzięki za informacje. –

6

Musisz uzyskać zaznaczenie z dokumentu/okna w elemencie iframe.

function getIframeSelectionText(iframe) { 
    var win = iframe.contentWindow; 
    var doc = win.document; 

    if (win.getSelection) { 
    return win.getSelection().toString(); 
    } else if (doc.selection && doc.selection.createRange) { 
    return doc.selection.createRange().text; 
    } 
} 

var iframe = document.getElementById("my"); 
alert(getIframeSelectionText(iframe)); 
17

document.getSelection

Czy na zewnętrznej dokumentu. Aby uzyskać wybór dokumentu w iframe trzeba chwyć wewnętrzny dokument:

var iframe= document.getElementById('my'); 
var idoc= iframe.contentDocument || iframe.contentWindow.document; // ie compatibility 

idoc.getSelection() 

jednak pamiętać, że WebKit nie obsługuje document.getSelection()lubdocument.selection. Spróbuj zastępując ją window.getSelection() który działa zarówno w Firefox i WebKit, ale zwraca obiekt selekcji (zbiór/otoki wokół zakresy), który potrzebuje sznurka:

var idoc= iframe.contentDocument || iframe.contentWindow.document; 
var iwin= iframe.contentWindow || iframe.contentDocument.defaultView; 

''+iwin.getSelection() 

Nie jestem pewien, co to jest punkt:

if (window.RegExp) { 
    var regstr = unescape("%20%20%20%20%20"); 
    var regexp = new RegExp(regstr, "g"); 
    str = str.replace(regexp, ""); 
} 

RegExp jest podstawowym JavaScriptem sięgającym najwcześniejszej wersji; zawsze będzie tam, nie musisz go obwąchiwać. Kodowanie URL-e wielu spacji jest dość niepotrzebne. Nie potrzebujesz nawet RegExp jako takiego, zastępowanie ciągu może być napisane jako:

str= str.split('  ').join(''); 
+0

window.getSelection() zwraca obiekt zaznaczenia, a nie zakres. toString w zaznaczeniu da ci tekst zaznaczenia. –

+0

Tak, '' '+ 'jest idiomem dla toString. – bobince

+0

Tak, wiem. Poprawiłem drobny błąd w twoim odwołaniu do obiektu zaznaczenia zwróconego przez window.getSelection() jako zakres, ale zgadzając się z tobą, że twój kod będzie działał. –

2

Poniższy kod zwróci zaznaczony tekst.

function getSelectedText(frameId) { 
    // In ExtJS use: 
    // var frame = Ext.getDom(frameId); 
    var frame = document.getElementById(frameId); 

    var frameWindow = frame && frame.contentWindow; 
    var frameDocument = frameWindow && frameWindow.document; 

    if (frameDocument) { 
     if (frameDocument.getSelection) { 
      // Most browsers 
      return String(frameDocument.getSelection()); 
     } 
     else if (frameDocument.selection) { 
      // Internet Explorer 8 and below 
      return frameDocument.selection.createRange().text; 
     } 
     else if (frameWindow.getSelection) { 
      // Safari 3 
      return String(frameWindow.getSelection()); 
     } 
    } 

    /* Fall-through. This could happen if this function is called 
     on a frame that doesn't exist or that isn't ready yet. */ 
    return ''; 
} 

Mam nadzieję, że to pomoże komuś.

+0

W firefoxie w konsoli: Błąd: Zezwolono na dostęp do właściwości 'document'. "Jest w linii gdzie jest:" var frameDocument = [... ] ". – Piotrek

1

Ten kod działa we wszystkich nowoczesnych przeglądarek:

var iframe = document.getElementById('my'); 
var idoc = iframe.contentDocument || iframe.contentWindow.document; // ie compatibility 
var text = idoc.getSelection().toString(); 
Powiązane problemy