2013-09-01 51 views
1

我正在開發一個應用程序,檢查我的數據庫是否已更新,如果是,我的應用程序顯示新值。服務器發送事件 - 跨域safari

客戶端:

if(typeof(EventSource)!=="undefined") { 
    var eSource = new EventSource("http://mydomain.org/app.php"); 
    eSource.onmessage = function(event) {} 
} 

服務器端:

<?php 
header("Content-Type: text/event-stream"); 
header("Cache-Control: no-cache"); 
header("Access-Control-Allow-Origin: *"); 
echo "data:Hello World\n\n"; 
?> 

現在,一切都在Firefox和Chrome。該應用程序將在基於Safari的瀏覽器中運行。在Safari中,我得到

SECURITY_ERR: DOM Exception 18: An attempt was made to break through the security policy of the user agent. 

所以這個問題已經是與跨域張貼,即使訪問控制允許來源有一個通配符。任何方式使這項工作在Safari?

回答

1

WebKit尚不支持SSE中的CORS。解決方案:

  1. 從同一來源獲取,new EventSource("/app.php"); Safari瀏覽

  2. 使用CORS感知填充工具。 https://github.com/Yaffle/EventSource

  3. 創建在相同的起源,你的SSE流(http://mydomain.org/iframe.html),在iframe讀同源流iframe和使用postMessage()事件發送到其他來源。

+0

解決方案1:HTML文件必須從硬盤驅動器運行(如瀏覽器中的小部件)。 解決方案3:用戶可以提供樣式參數,因此使用iFrame時,不可能從另一個原點對元素進行樣式設置。 看來我將不得不尋找解決方案2. –

+0

@TomBroucke iframe可能是不可見的。 – Kornel

+0

是的,我之前沒有使用過postMessage(),但是這對我的問題來說似乎是一個很好的解決方案。謝謝 –

0

什麼版本的Safari? 我相信EventSource的CORS在Chrome 25+和Safari 6.1+之前已經崩潰。