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> 

avec smth fonction je peux obtenir le texte sélectionné de certains div, mais il ne fonctionne pas avec iframe. des idées pour obtenir le texte sélectionné de iframe?comment obtenir le texte sélectionné de iframe avec javascript?

Répondre

6

Vous ne pouvez pas accéder aux données à l'intérieur d'un iframe provenant d'un domaine différent du vôtre. Ceci est dû au Same origin policy.

+2

ok, désolé mauvais exemple, dans iframe j'ai texte, j'utilise iframe pour l'éditeur WYSIWYG, il est donc pas sur un domaine différent. –

+0

Merci pour l'information. –

6

Vous devez obtenir la sélection dans le document/la fenêtre de l'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

est sur le document externe. Pour obtenir la sélection du document dans l'iframe vous devez saisir le document interne:

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

idoc.getSelection() 

Notez cependant que WebKit ne supporte pas document.getSelection()oudocument.selection. Essayez de le remplacer par window.getSelection() qui fonctionne dans Firefox et WebKit, mais retourne un objet de sélection (une collection/emballage Ranges autour), qui doit Corder:

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

''+iwin.getSelection() 

Je ne suis pas sûr de ce que le point de ceci est:

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

RegExp est JavaScript de base datant de la version très tôt; il sera toujours là, vous n'avez pas à le sentir. L'encodage d'URL de plusieurs espaces est tout à fait inutile. Vous ne même pas besoin RegExp en tant que telle, une chaîne remplacer pourrait être écrit:

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

window.getSelection() renvoie un objet de sélection, pas un Range. toString sur la sélection vous donnera le texte de sélection si. –

+0

Oui, ''' +' est un idiome pour toString. – bobince

+0

Oui, je sais. Je corrigeais une erreur mineure en faisant référence à l'objet de sélection retourné par window.getSelection() en tant que Range mais en convenant avec vous que votre code fonctionnerait. –

2

code suivant renvoie le texte sélectionné.

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 ''; 
} 

Espérons que cela aidera quelqu'un.

+0

Dans firefox dans la console: Erreur: Permission refusée d'accéder à la propriété 'document' ".Il est dans la ligne où est:" var frameDocument = [... ] ". – Piotrek

1

Ce code fonctionne dans tous les navigateurs modernes:

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