2012-05-31 102 views
2

這是一種情況。我的客戶將擁有自己的網頁。在該頁面上,他們可能會有一個iFrame,他們可以在其中顯示位於我的服務器上的頁面。在iFrame之外他們會有簡單的按鈕,點擊時應該在iFrame中執行javascript功能。跨域JavaScript通信

所以基本上客戶的網頁對客戶的域代碼將是這樣的

<input type="button" value="Say Hi" id="TestButton"> 
<iframe src="myserver.com/some_html_page.htm" width="800" height="550"></iframe> 

myserver.com/some_html_page.htm代碼將是

$("#TestButton").click(function(){ 
    alert("Hi"); 
}); 

我沒有我的啓發式算法和我知道的瀏覽器安全問題,但我想知道有沒有辦法處理這個問題,可能是json什麼的?

+0

可能重複的[跨域iframe問題](http:// stackoverflow。com/questions/9393532/cross-domain-iframe-issue) – Quentin

回答

-1

做跨域請求的一種常見模式是使用JSONP

+1

問題是關於在框架中引發JavaScript函數,而不是從框架中獲取數據。 – Quentin

0

讓我們考慮,如果你有一個叫做test()哪個iframe下加載功能,那麼您可以訪問test()功能如下

document.getElementsByName("name of iframe")[0].contentWindow.functionName() 

​​
1

正如你可能已經知道(給家長和孩子都在不同的域),你絕對不能從孩子的iFrame可達到父偵聽事件。

解決方法之一是在頁面之間傳遞消息。這將要求你的客戶在他們的頁面中包含額外的javascript以及指向你的服務器的iFrame。這在原生javascript中支持postMessage,但包括@Mark Price建議將使您的生活更輕鬆。

所以這裏去一個例子:

客戶頁數:myserver.com/some_html_page.htm

... 
    <script type="text/javascript" src="jquery.min.js"></script> 
    <script type="text/javascript" src="jquery.postMessage.min.js"></script> 

    <script type="text/javascript">  
    $(document).ready(function() { 
     $("#TestButton").click(function(){ 
     jQuery.postMessage("say_hi", "myserver.com/some_html_page.htm"); 
     }); 
    }); 
    </script> 
</head> 

<input type="button" value="Say Hi" id="TestButton"> 
<iframe src="myserver.com/some_html_page.htm"></iframe> 

代碼:

... 
    <script type="text/javascript" src="jquery.min.js"></script> 
    <script type="text/javascript" src="jquery.postMessage.min.js"></script> 

    <script type="text/javascript"> 
    // you will need to set this dynamically, perhaps by having your 
    // clients pass it into the URL of the iFrame, 
    // e.g. <iframe src="myserver.com/some_html_page.htm?source_url=.. 
    var source_origin = "clients_page.com/index.html"; 

    var messageHandler = function (data) { 
     // process 'data' to decide what action to take... 
     alert("Hi"); 
    }; 

    $.receiveMessage(messageHandler, source_origin); 
    </script> 
</head> 

也許這將是很好的捆綁客戶端編碼到一個他們可能包含的單個庫中,這樣您的客戶就不會因編寫自己的JavaScript而承受沉重負擔。

作爲一個告誡,我把這段代碼寫在了我的頭上,它可能會充滿錯別字。我之前使用過這個庫來實現類似的目標,我希望這個答案對你來說是一個有用的跳板點(以及plugin documentation)。

讓我知道我是否可以澄清任何事情,並祝你好運! :)