访问使用window.open打开的窗口的内容

时间:2015-10-07 15:44:39

标签: javascript debugging

我知道我可以访问用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控制台使用其uniqueWindowId获取窗口?

1 个答案:

答案 0 :(得分: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>