[英]Can I control two browser windows with one HTML5 app?
我希望我的HTML5應用程序能夠繪制到兩個不同的屏幕上。 這(我認為)意味着我需要兩個不同的瀏覽器窗口,每個屏幕一個。 這可能嗎? 看來我真的必須將同一個應用程序加載到兩個窗口中,並且不知何故讓窗口相互通信。 我找不到如何實現這一目標的例子。 我怎樣才能實現呢?
為了更加精彩:可能沒有涉及服務器,只是從文件系統本地提供的應用程序。
使用本地存儲或(顫抖)cookie不需要凌亂的輪詢基礎設施。 假設這兩個頁面是從同一個域提供的, 只要第一個窗口被第一個窗口打開,實現跨窗口通信就很簡單了。
在您的主窗口中:( 單擊此處獲取JSFiddle演示 , 此處查看輔助頁面的代碼 )
var win2;
function openSecondaryWindow() {
return win2 = window.open('win2.html','secondary','width=300,height=100');
}
$(function() {
if (!openSecondaryWindow()) // Try to open the window. This will likely be blocked by a popup blocker (unless you disable it).
$(document.body) // If it is blocked, clicking a link usually allows the popup to be spawned.
.prepend('<a href="#">Popup blocked. Click here to open the secondary window.</a>')
.click(function() { openSecondaryWindow(); return false; });
$('#somelink').click(function() {
if (win2) win2.doSomething(); // Obviously, you'll need to define doSomething in the second page
else alert('The secondary window is not open.');
return false;
});
});
一旦主窗口打開了輔助窗口, win2
將引用第二頁的window
對象 - 換句話說,頁面的全局范圍。 您可以訪問第二頁中定義的所有函數和變量。
因此,您可以通過函數調用傳遞數據。
win2.update({ key: 'value', ... });
在輔助窗口中,您可以通過opener
屬性回調主窗口中的函數,該屬性將引用主窗口的window
對象。 (這在JSFiddle演示中得到了證明。)
更新: Intercom是一個使用本地存儲在Windows之間實現廣播消息傳遞的庫。 當數據發生更改時,本地存儲會觸發事件( onstorage
),因此實際上不需要輪詢。 內部通信允許域上的所有頁面進行通信,無論它們是如何打開的。
這可能是你可以使用
websockets的東西,讓每個窗口將其信息發送回應用程序,然后讓它們更新,但是所有瀏覽器都不支持這些,事實上我認為由於安全問題,目前大多數構建都會刪除它們與規范。
對於脫機應用程序,如果它們位於同一個域,我假設它們將在本地,您可以使用本地存儲甚至cookie,然后讓應用程序輪詢存儲API的更改?
我最近一直在做離線本地存儲的一些實驗,我能夠在本地維護windows與Chrome之間的狀態,在Firefox中這不起作用,但我相信它已在FF4 RC中修復
編輯2:
在兩個文件中拼湊出快速而骯臟的概念證明:
指數1:
<body>
<div id="result">x</div>
</body>
<script type="text/javascript">
var i = 0;
function update(){
setTimeout(function(){
localStorage.setItem("bar", i);
document.getElementById('result').innerHTML = "localstorage set to " + localStorage.getItem("bar");
i++;
console.log(i);
update();
}, 2000);
}
update();
</script>
指數2:
<body>
<div id="result">s</div>
</body>
<script type="text/javascript">
function update(){
setTimeout(function(){
document.getElementById('result').innerHTML = localStorage.getItem("bar");
update();
}, 1000);
}
update();
</script>
在本地Chrome中的不同窗口中打開它們,第二個將顯示第一個窗口中循環設置的狀態。 我發現仍然沒有在FireFox 4中工作(Mozilla Dev昨天向我發誓當前離線本地存儲工作正常,哦,好吧)。 您可以通過http://www.modernizr.com/在IE中使用它,但我還沒有測試過。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.