2009-10-24 36 views
3

目前我依靠一個代理腳本來處理這個單一來源策略的問題。它很慢,並且造成開銷。更何況,JavaScript不呈現。替代跨域javascripting?

在那裏有一個工作替代?

回答

1

哦,親愛的,我認爲你要找的解決方案是使用IFRAME。然而,iframe方法既是精神上的,也是技術性的。我建議你開始與本指南:

Cross-Domain Communication with IFrames

解決的辦法是異步使用腳本標記和JSON從另一臺服務器獲取數據:

<script src="http://remotesite.com/path/to/script/blah.js"></script> 

您可以創建一個新的腳本元素傳遞並加載數據並附加到DOM或將標記插入到元素innerHTML中。

我確定你可以找到一些詳細的例子和實現方法,但是你應該跟着新的SCRIPT方法跟蹤一件事,那就是添加很多DOM。這可能會幫助併爲您提供了一個起點:

function require (url, callback) { 
    if (!isScriptLoaded(url)) { 
     document.write('<script src="' + url + '" type="text/javascript" charset="utf-8"><\/script>'); 

     if (callback) { 
      callback(); 
     } 
    } 
} 

function isScriptLoaded(src) { 
    var scriptsLoaded = {}; 
    var scriptTags = document.getElementsByTagName("script"); 

    for (var i = 0, script; script = scriptTags[i]; i++) { 
     if (script.src) { 
      scriptsLoaded[script.src] = 1; 
     } 
    }; 

    if (scriptsLoaded[src]) { 
     return true; 
    } 

    return false; 
} 

無論哪種方式 - 好運(未經測試,但應該工作!)。

+0

是的。 iframe加載外部頁面,並且需要在其上運行一些JavaScript。然而,由於單一原始政策,這是不允許的。因此,依靠代理不是最優的或有效的。 – dooli 2009-10-24 21:25:37

+0

可悲的是,沒有具體細節,我無法適當回覆這個問題。在我看來,這不是問題,但我的解決方案工作取決於您的後端設置等。 要按照您的意見: - iframe加載外部頁面 - iframe URL可以包含params來指示JS回調和參數 - 本地iframe JS解釋這一點,並繼續 顯然這不會工作,如果你正在談論一些動態的JS或許多值被傳遞... 我的印象是,這不會幫助你,因爲你有更深的需要但它可能會幫助其他人。 – donohoe 2009-10-25 00:04:16

5

如果您可以提供回調名稱作爲提供相關JavaScript代碼的服務的參數,那麼您可以在文檔中附加腳本標記,並指定src屬性指向服務調用。否則,你運氣不好。

+0

這通常被稱爲JSONP或帶填充符的JSON甚至更進一步:帶有填充符的JavaScript對象符號。 :) – 2009-10-24 20:34:39

+0

請注意,在Internet Explorer中,大型腳本可能會導致內存泄漏,但在刪除腳本標記後不會釋放大量內存使用。如果您在每個網頁瀏覽中只撥打1或2個電話,則這不是主要問題,但如果您希望網頁保持打開狀態並長時間撥打電話,則可能需要使用極慢電腦的用戶投訴:) – 2009-10-24 20:35:20

1

JSON-P非常適合這種事情。這將取決於你正在嘗試做的是什麼,將決定是否使用JSON-

http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback

當然,如果你使用jQuery或類似的JavaScript庫,你的工作是由更容易P,隱藏的iframe,postMessage,Flash代理或任何其他奇特的解決方案。

2

使用iframe和嘗試window.postMessage(message, origin)(這將是從首頁的iframe和iframeElement.contentWindow.postMessageparent.postMessage)所有的最新主要瀏覽器(Firefox,IE,Safari瀏覽器,瀏覽器等)和改變/輪詢window.name爲舊的瀏覽器。

1

如果您控制兩個域並只關心Firefox 3.5+,則可以使用XMLHttpRequest對象並使用Access Control設置權限。