2014-11-12 3 views
0

У меня есть окно, в котором я загружаю iframe.Доступ к функции iframe

Расположение окна

"http://localhost/current/test.html" 

и расположение фрейма является

"http://localhost/current/testFrame.html" 

И сценарий в моем test.html пытается получить доступ к функции, которая присутствует в область действия окна iframe. Но он дает разрешение на отказ.

Для, например, от моего главного окна я выполнение этой строки скрипта

$("iframe")[0].contentWindow.getState(); //Permission Denied 

И я пытаюсь получить доступ к этой функции, когда IFrame полностью загружен.

Как родительское окно может получить доступ к функции iframe, так как оба окна находятся в одном и том же источнике.

+0

Какой браузер? Или все браузеры? – DontVoteMeDown

+0

Так странно, что вы получаете проблему CORS с одинаковыми доменными страницами. Проверьте [это] (http://stackoverflow.com/a/364997/1267304). – DontVoteMeDown

+0

Вы должны сделать исследование, прежде чем спрашивать. [старый вопрос] [1] [1]: http://stackoverflow.com/questions/1600488/calling-javascript-function-in-iframe –

ответ

1

вы должны использовать JavaScript PostMessage и создать систему API кросс окна

, например:

parent.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8"> 
    <title>parent</title> 
    <script> 
     function iframeAction(actionId){ 
      var iframe = document.getElementById('myIframe'); 
      iframe.contentWindow.postMessage(actionId,'*'); 
     } 
    </script> 
</head> 

<body> 
    <button type="button" onclick="iframeAction(1)">do iframe action 1</button> 
    <button type="button" onclick="iframeAction(2)">do iframe action 2</button> 
    <br> 
    <iframe src="./iframe.html" id="myIframe" /> 
</body> 

</html> 

iframe.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8"> 
    <title>parent</title> 

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
    <script> 

     //page generic functions 
     function doActoin_1(){$("#labal").html("Action 1");} 
     function doActoin_2(){$("#labal").html("Action 2");} 

     // Listen to message from parent 
     var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; 
     var eventer = window[eventMethod]; 
     var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; 

     eventer(messageEvent,function(e) { 
      switch(e.data){ 
       case 1: doActoin_1(); break; 
       case 2: doActoin_2(); break; 
      }   
     },false); 

    </script> 

</head> 

<body> 
    <h1 id="labal">iFrame</h1> 
</body> 

</html> 

Как вы можете видеть, iframe.html содержит обычную функцию javascript, но, добавив оконный прослушиватель, вы можете создать динамический API для использования окон ader.

надеюсь, что это поможет.

-2

Вы можете получить доступ к iframe, используя window.frames.

window.frames[0] должен дать первый iframe.

Пример -

<iframe name="frame1" src="testframe.html"></iframe> 

могут быть доступны с

window.frames["frame1"] 

должен дать window объект для iframe.

+1

UM, как это отличается от '$ (" iframe ") [0]'? – epascarello

+1

Я не уверен, отвечает ли этот вопрос на этот вопрос. – DontVoteMeDown

+0

Не уверен в части jQuery, она возвращает объект окна? – jaibatrik

0

Другой способ достижения того, что вы хотите, будет использовать window.postMessage, чтобы отбросить внутреннюю функцию и использовать другое сообщение, чтобы вернуть результат родительскому объекту.

В IFRAME:

window.addEventListener("message", function(e) { 
    var state = getState(); 
    e.source.postMessage(state, "*"); 
}, false); 

В родителю:

window.addEventListener("message", function(e) { 
    var state = e.data; //do something with your data 
}, false); 

$("iframe")[0].contentWindow.postMessage("getState", "*"); 

Просто замените * с доменом. Более подробную информацию вы можете найти here.

Смежные вопросы