2009-10-21 40 views
46

Tôi gặp sự cố khi gọi hàm JavaScript trong một trang iframe từ trang gốc. Dưới đây là hai trang của tôi:Chức năng gọi javascript trong iframe

mainPage.html

<html> 
<head> 
    <title>MainPage</title> 
    <script type="text/javascript"> 
     function Reset() 
     { 
      if (document.all.resultFrame) 
       alert("resultFrame found"); 
      else 
       alert("resultFrame NOT found"); 

      if (typeof (document.all.resultFrame.Reset) == "function") 
       document.all.resultFrame.Reset(); 
      else 
       alert("resultFrame.Reset NOT found"); 
     } 
    </script> 
</head> 
<body> 
    MainPage<br> 
    <input type="button" onclick="Reset()" value="Reset"><br><br> 
    <iframe height="100" id="resultFrame" src="resultFrame.html"></iframe> 
</body> 
</html> 

resultFrame.html

<html> 
<head> 
    <title>ResultPage</title> 
    <script type="text/javascript"> 
     function Reset() 
     { 
      alert("reset (in resultframe)"); 
     } 
    </script> 
</head> 
<body> 
    ResultPage 
</body> 
</html> 

(Tôi biết rằng document.all không được khuyến khích nhưng trang này chỉ nên được xem với IE nội bộ và tôi không nghĩ đó là vấn đề)

Khi nào Tôi nhấn nút Đặt lại tôi nhận được "resultFrame found" và "resultFrame.Reset NOT found". Nó dường như có một tham chiếu đến khung nhưng không thể gọi hàm trên khung, tại sao lại như vậy?

+1

trùng lặp của http://stackoverflow.com/questions/251420/invoking-javascript-in-iframe-from-parent-page –

+0

Có thể trùng lặp với [Gọi mã JavaScript trong iframe từ trang mẹ] (http://stackoverflow.com/questions/251420/invoking-javascript-code-in-an-iframe-from-the-parent-page) – luk3yx

Trả lời

86

Sử dụng:

document.getElementById("resultFrame").contentWindow.Reset(); 

để truy cập chức năng Reset ở iframe

document.getElementById("resultFrame") sẽ nhận được iframe trong mã của bạn, và contentWindow sẽ nhận được đối tượng cửa sổ trong iframe. Khi bạn có cửa sổ con, bạn có thể tham khảo javascript trong ngữ cảnh đó.

Cũng thấy HERE đặc biệt là câu trả lời từ bobince.

+3

Xin chào Jonathan, does .contentWindow vẫn hoạt động? Tôi làm 'console.log (document.getElementById ('iframeID'). ContentWindow)' và trong Firebug nó hiển thị chính xác hàm 'test()' của tôi trong khung nội tuyến của tôi, nhưng khi tôi đi gọi hàm nó nói nó không phải là một hàm , nhưng nó là! Thử nghiệm nó trong FF4. –

2

objectframe.contentWindow.Reset() bạn cần tham chiếu đến phần tử cấp cao nhất trong khung trước tiên.

3

Gọi

window.frames['resultFrame'].Reset(); 
1

Khi bạn truy cập resultFrame qua document.all nó chỉ kéo nó như một phần tử HTML, không phải là một khung cửa sổ. Bạn nhận được cùng một vấn đề nếu bạn có một khung lửa một sự kiện bằng cách sử dụng một "này" tự tham khảo.

Thay thế:

document.all.resultFrame.Reset(); 

Với:

window.frames.resultFrame.Reset(); 

Hoặc:

document.all.resultFrame.contentWindow.Reset(); 
5

Thay vì nhận được khung từ tài liệu, hãy thử nhận khung từ đối tượng cửa sổ.

trong ví dụ trên thay đổi này:

if (typeof (document.all.resultFrame.Reset) == "function") 
    document.all.resultFrame.Reset(); 
else 
    alert("resultFrame.Reset NOT found"); 

để

if (typeof (window.frames[0].Reset) == "function") 
    window.frames[0].Reset(); 
else 
    alert("resultFrame.Reset NOT found"); 

vấn đề là phạm vi của javascript bên trong iframe không tiếp xúc thông qua các phần tử DOM cho iframe. chỉ các đối tượng cửa sổ chứa thông tin phạm vi javascript cho các khung.

4

Đối mạnh mẽ hơn:

function getIframeWindow(iframe_object) { 
    var doc; 

    if (iframe_object.contentWindow) { 
    return iframe_object.contentWindow; 
    } 

    if (iframe_object.window) { 
    return iframe_object.window; 
    } 

    if (!doc && iframe_object.contentDocument) { 
    doc = iframe_object.contentDocument; 
    } 

    if (!doc && iframe_object.document) { 
    doc = iframe_object.document; 
    } 

    if (doc && doc.defaultView) { 
    return doc.defaultView; 
    } 

    if (doc && doc.parentWindow) { 
    return doc.parentWindow; 
    } 

    return undefined; 
} 

... 
var el = document.getElementById('targetFrame'); 

getIframeWindow(el).reset(); 
... 
2

Các điều kiện đầu tiên và quan trọng nhất mà cần phải được đáp ứng là cả phụ huynh và iframe phải thuộc về cùng một nguồn gốc. Khi việc đó được thực hiện, trẻ có thể gọi cha mẹ bằng phương thức window.opener và cha mẹ có thể thực hiện tương tự cho trẻ như đã đề cập ở trên

0

Nếu bạn không thể sử dụng trực tiếp và nếu bạn gặp phải lỗi này: Chặn khung có nguồn gốc "http://www ..com" khi truy cập khung hình gốc. Bạn có thể sử dụng postMessage() thay vì sử dụng chức năng trực tiếp.

Các vấn đề liên quan