我不確定發生了什麼,但是IE的window.open工程可行!
我有一段JavaScript代碼從角度控制器調用,它打開第二個窗口(在同一個域中,彈出窗口阻止關閉),並嘗試在第二個窗口中調用JavaScript方法。IE9 window.open問題
我的代碼:
var newWindow = $window.open('somefile.html?' + Math.random(1000));
var fn = function() {
//alert('I got called');
newWindow.display($scope.mymsg);
}
if (newWindow.addEventListener)
newWindow.addEventListener("load", fn, false);
else if (newWindow.attachEvent)
newWindow.attachEvent("onload", fn);
else
newWindow.onload = fn;
我需要支持IE8和IE9。我擺弄的代碼,並得到它在IE8上工作,但我不能讓它在IE9上工作。
如果我取消註釋警報,在IE9中,我從來沒有看到這一點。我不知道爲什麼,因爲我正確地附加onload處理程序。我懷疑存在某種競爭條件,但是如果是這種情況,我會在新窗口的display()中遇到問題,但它甚至不會到達那裏,因爲onload不會被調用。
UPDATE: 所以玩弄與jQuery包裝新創建的窗口,幫助了很多:
var newWindow = $window.open('somefile.html?z=' + Math.random(1000));
$(newWindow).load(function() { this.display($scope.mymsg); });
而且我追加的虛擬「Z」參數我剛纔錯過。我幾乎有它的工作。 現在看起來好像當你第一次打開這個頁面,然後快速點擊按鈕打開第二個窗口,第二個窗口在IE8中打開(它應該有一些傳遞給它的消息)。但是,如果您打開該頁面並等待幾秒鐘,則第二個窗口會正確顯示傳入的消息。
我還在第二個窗口的display()方法中添加了$(document).ready()。
我之前沒有提到的另一件事,但我認爲可能與此有關,是打開此窗口的整個機制被封裝在$ q.all()中。這是因爲在打開第二個窗口之前,我打電話來保存數據並返回驗證消息。我不知道是否有什麼事情正在發生,這是造成這種競爭條件。
UPDATE2: 將代碼移動到$ q中承諾鏈中的最後一個承諾。所以現在看起來像這樣:
$q.all([
//load data and put validate errors into $scope.mymsg
]).then(
function()
{
$(document).ready(function() {
var newWindow = $window.open('somefile.html?z=' + Math.random(1000));
$(newWindow).load(function() { this.display($scope.mymsg); });
});
},
function()
{
}
);
問題仍然存在,但少了很多。這絕對是一個競賽條件,但我無法弄清楚。如果您打開某些頁面並單擊一個按鈕打開第二個窗口而不等待頁面完全加載,它仍然可能在某些隨機情況下發生。
查看我的更新日誌 – BlueChameleon 2014-11-04 15:41:00
因此,經過我所有的研究,上述方法是唯一一個在IE8,IE9,Chrome和FF中全部工作的人。打開一個窗口並嘗試在新窗口中將值傳遞給一個函數,因爲某些未知的競爭條件(或其他我不知道的東西),只能在IE8/IE9中有效。窗口始終打開,但有時新窗口的onload函數不會被調用。從opener讀取值似乎是讓它在上面列出的瀏覽器上工作的唯一方法。 – BlueChameleon 2014-11-11 17:04:08
驗證這是唯一完全跨瀏覽器的解決方案。而且,如果您需要通過唯一標識符獲取特定對象,而不是已知的命名對象,則可以向url中添加查詢字符串參數並從location.href解析出來,並從子窗口中進行類似window.opener.lookupDictionary [passedParameter]並獲取特定的請求記錄。 – Bon 2015-08-13 20:58:53