2015-10-07 33 views
0

打開我知道我可以訪問與window.open打開像這樣的窗口:訪問窗口的內容與window.open

var myWindow = window.open('url','uniqueWindowId','argument=value,argument=value') 
myWindow.document.getElementById('someId').display = "none"; 
myWindow.document.getElementsByClassName('someClass')[17].firstChild.style.backgroundColor = "red"; 
... 

但是我有,調試第三方代碼的過程中,問題我無法從控制檯訪問myWindow變量(myWindow僅限於函數的作用域)。有沒有什麼辦法可以從父窗口的javascript控制檯使用獨特的WindowowId來獲取窗口?

+0

我猜修改代碼,使變量全球是不可能的? –

+1

由於js在你的瀏覽器中運行,我認爲你應該能夠在'window.open'之後的斷點上執行,並在控制檯中執行類似'window.globalMyWindow = myWindow'的操作,以便它可以在其他地方訪問? –

回答

1

沒有標準的函數來獲得,但我可以看到一個可能的方式:

function retrievePopupWindowHandle(windowName, callback){ 
    window.open('javascript:window.opener.handleRetrieved = window;', windowName); 

    setTimeout(function(){ 
    var popupHandle = window.handleRetrieved; 
    delete window.handleRetrieved; 

    callback(popupHandle); 
    }, 1); 
} 

但請記住你還是沒各項安全防範措施,如相同的協議和原產地政策。

這不是建議,但它會工作。

快速測試顯示它的工作原理(它不會的jsfiddle由於安全策略的工作,在本地創建一個文件,並在瀏覽器中打開它):

<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
    <button id="b">Create Window</button> 
    <button id="b2">Retrieve Handle &amp; Test</button> 
<script> 
var popupWindow; 

function retrievePopupWindowHandle(windowName, callback){ 
    window.open('javascript:window.opener.handleRetrieved = window;', windowName); 

    setTimeout(function(){ 
    var popupHandle = window.handleRetrieved; 
    delete window.handleRetrieved; 

    callback(popupHandle); 
    }, 1); 
} 

document.getElementById('b').addEventListener('click', function(){ 
    popupWindow = window.open('about:blank', 'popupWindow'); 
}); 

document.getElementById('b2').addEventListener('click', function(){ 
    retrievePopupWindowHandle('popupWindow', function(popup){ 
     if(popupWindow == popup) 
     alert('Handles Match!'); 
    }); 
}); 
</script> 
</body> 
</html> 
相關問題