2010-06-09 96 views
2

我正在爲網站製作html小部件。比方說,它會顯示當前的股票指數。
總之,任意的網站所有者需要從我的代碼片段,並將其包含在他的網頁http://website.com/index.html。當任意用戶打開http://website.com/index.html時,我的代碼將請求發送到我的服務器(provider.com),該服務器執行必要的操作並將信息返回給用戶的瀏覽器。當響應已到達時,用戶將在http://website.com/index.html上看到相關庫存值。html小部件與服務器通信

在index.html的服務可以這樣調用

<script type="text/javascript" src="provider.com/service.js"> </script> 
<div id="target_area"></div> 
<script type="text/javascript"> 
    service.show("target_area", options); 
</script> 

現在的問題是在same origin policy:我不能只從website.com發送Ajax請求provided.com並返回的HTML嵌入客戶的網頁。我看到幾個解決方案,我在下面列出,但沒有一個讓我滿意。我想知道,如果你能提出一些建議,特別是如果你有一些相關的經驗。

1)iframe,簡單明瞭。缺點:必須具有固定尺寸+出現在某些瀏覽器中的愚蠢滾動條。可以用javascript修復,但所有這些特定於瀏覽器的修補對我來說聽起來都不太好。

2)JSONP。問題:無法返回整個html塊,只能返回數據。然後,在瀏覽器端,我必須使用javascript將數據嵌入靜態放置在index.html中的html代碼段中。聽起來不太好,因爲數據格式不是很簡單,甚至可能稍後會改變。

3)使用隱藏的iframe做ajax請求。有點棘手,但聽起來像是一種方式。

那麼,這是我對這個問題的想法。有沒有更好的方法?
順便說一句,我試圖檢查一些現有的小部件,但沒有找到很多有用的信息。

本文中使用的所有域名都是虛構如有雷同,純屬巧合:)

更新現在 作品,SLaks建議!如果任何人的興趣在細節,響應HTML有這樣的(紅寶石),以進行後處理,

body = body.gsub '"', '\\"' 
body = body.gsub /\n/, '\\n'; 
body = body.gsub '/', '\\/'; 
body = params[:callback] + '("' + body + '");'; 

之後,你可以使用jQuery與「數據類型:‘JSONP’」選項。

回答

1

您可以使用JSONP發送包含原始HTML的字符串。

JSONP是這裏最好的選擇。

+0

你的意思是,轉義html並將其作爲字符串常量返回?聽起來不錯,但是在服務器上添加這樣的後期處理可能會非常棘手(我在rails上使用ruby,但是在java中我知道這也不是微不足道的)。無論如何,我會試一試! – 2010-06-09 02:21:12

+0

您的環境應該有一個JSON編碼器。 – SLaks 2010-06-09 02:28:19

+0

確實,但它假定我返回json,而不是html。編碼它有點棘手(取代引號,換行符等),但我正在路上。 – 2010-06-09 03:03:55

1

我過去解決過這個問題的方法是在website.com上運行一個非常輕量級的代理,它將接受來自客戶端的AJAX請求,將它傳遞給provider.com,並將返回的結果從provider.com返回。我不確定這是否是您的環境中可以接受的解決方案。該解決方案的

一個好處是,你可以在代理添加值,比如緩存回答了一段時間,加密和/或壓縮與provider.com,認證和授權的通信等

+0

謝謝,但它對網站上的服務器類型提出了不合理的要求,而我無法控制它。但是,無論如何,嘗試+1的:) – 2010-06-09 04:22:08