2009-09-24 9 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> 

với chức năng smth tôi có thể nhận văn bản đã chọn từ một số div, nhưng nó không hoạt động với khung nội tuyến. bất kỳ ý tưởng nào về cách nhận văn bản được chọn từ khung nội tuyến?cách nhận văn bản được chọn từ khung nội tuyến bằng javascript?

Trả lời

6

Bạn không thể truy cập dữ liệu bên trong một số iframe từ một miền khác với tên miền của bạn. Điều này là do Same origin policy.

+2

ok, ví dụ lỗi sai, trong iframe tôi có văn bản, tôi sử dụng iframe cho editor WYSIWIG, vì vậy nó không phải là trên tên miền khác nhau. –

+0

Cảm ơn thông tin. –

6

Bạn cần lấy vùng chọn từ tài liệu/cửa sổ trong khung nội tuyến.

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

là trên các tài liệu bên ngoài. Để có được sự lựa chọn của các tài liệu trong iframe bạn cần phải lấy các tài liệu bên trong:

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

idoc.getSelection() 

Lưu ý tuy nhiên WebKit mà không hỗ trợ document.getSelection()hoặcdocument.selection. Hãy thử thay thế nó bằng window.getSelection() mà làm việc trong cả Firefox và WebKit, nhưng trả về một đối tượng lựa chọn (một bộ sưu tập/wrapper xung quanh Ranges), mà cần xâu chuỗi:

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

''+iwin.getSelection() 

Tôi không chắc chắn những gì điểm của việc này là:

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

RegExp là JavaScript cơ bản có từ phiên bản sớm nhất; nó sẽ luôn ở đó, bạn không phải ngửi nó. Mã hóa URL của nhiều không gian là khá không cần thiết. Bạn thậm chí không cần RegExp như vậy, một chuỗi thay thế có thể được viết là:

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

window.getSelection() trả về một đối tượng lựa chọn, không phải là một phạm vi. toString trên vùng chọn sẽ cung cấp cho bạn văn bản lựa chọn. –

+0

Yep, ''' +' là một thành ngữ của toString. – bobince

+0

Vâng, tôi biết. Tôi đã sửa chữa một lỗi nhỏ trong của bạn đề cập đến các đối tượng lựa chọn trở về từ window.getSelection() như là một phạm vi nhưng đồng ý với bạn rằng mã của bạn sẽ làm việc. –

2

Mã sau sẽ trả về văn bản đã chọn.

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

Hy vọng điều này sẽ giúp người khác.

+0

Trong firefox trong giao diện điều khiển: Lỗi: Quyền bị từ chối truy cập tài sản 'tài liệu' ". Nó nằm trong dòng ở đâu:" var frameDocument = [... ] ". – Piotrek

1

Mã này hoạt động trong tất cả các trình duyệt hiện đại:

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