window.open 在 chrome 扩展中返回 undefined
我有基于内容脚本的 Chrome 扩展程序.我通过内容脚本中的弹出窗口启动登录过程.
I have content script based Chrome extension. I initiate the sign in process through a popup window in the content script.
我使用下面的代码打开一个弹出窗口,然后等待它关闭.
I open a popup window using the below code and then wait till its closed.
但是,我从 window.open
方法中得到一个未定义".有人知道为什么会这样吗?
However, I get an 'undefined' from window.open
method. Does anybody know why this happens?
loginwin
在下面的代码中是 undefined
,尽管弹出窗口打开时使用指定的 login_url
很好.下面的代码是从我的内容脚本中调用的.
loginwin
is undefined
in below code although the popup window opens up fine with the specified login_url
. The code below is called from my content script.
var loginWin = window.open(login_url, 'LoginWindow', "width=655,height=490");
console.log(loginWin);
// Check every 100 ms if the popup is closed.
var finishedInterval = setInterval(function() {
console.log('checking if loginWin closed');
if (loginWin.closed) {
clearInterval(finishedInterval);
console.log('popup is now closed');
Backbone.history.navigate('index', true);
}
}, 1000);
推荐答案
注意:此答案已过时.Chrome 扩展中的
window.open()
总是返回null
(当弹出窗口被阻止时)或window
对象.以下信息仅适用于非常旧的 (2012) 版本的 Chrome.
Note: This answer is obsolete.
window.open()
in a Chrome extension always returns eithernull
(when the popup is blocked) or awindow
object. The information below only applies to very old (2012) versions of Chrome.
<小时>
内容脚本无法访问页面的全局 window
对象.对于内容脚本,以下内容适用:
Content scripts do not have any access to a page's global window
object. For content scripts, the following applies:
window
变量不引用页面的全局对象.相反,它指的是一个新的上下文,一个页面上的层".页面的 DOM 是完全可访问的.#execution-environment
给定一个由 组成的文档<iframe id="frameName" src="http://domain/"></iframe>
:
Given a document consisting of <iframe id="frameName" src="http://domain/"></iframe>
:
- 对框架内容的访问受到页面同源策略的限制;您的扩展程序的权限不会放宽政策.
frames[0]
和frames['frameName']
,(通常指帧的包含全局window
对象)是 <强>未定义
.var iframe = document.getElementById('frameName');
iframe.contentDocument
返回包含框架的document
对象,因为内容脚本可以访问页面的 DOM.当应用同源策略时,此属性为null
.iframe.contentDocument.defaultView
(指与文档关联的window
对象)是undefined.iframe.contentWindow
是未定义.
- Access to the contents of a frame is restricted by the Same origin policy of the page; the permissions of your extension does not relax the policy.
frames[0]
andframes['frameName']
, (normally referring to the the frame's containing globalwindow
object) isundefined
.var iframe = document.getElementById('frameName');
iframe.contentDocument
returns adocument
object of the containing frame, because content scripts have access to the DOM of a page. This property isnull
when the Same origin policy applies.iframe.contentDocument.defaultView
(refers to thewindow
object associated with the document) is undefined.iframe.contentWindow
is undefined.
如您所见,
window.open()
不返回Window
实例(window.opener
也不返回,等等).As you can see,
window.open()
does not return aWindow
instance (neither doeswindow.opener
, and so forth).在页面中注入代码,使其在页面上下文中运行.注意:仅当您正在操作的页面可以信任时才使用此方法.要在注入脚本和内容脚本之间进行通信,您可以使用:
Inject the code in the page, so that it runs in the context of the page. Note: Only use this method if the page you're operating on can be trusted. To communicate between the injected script and the content script, you could use:
var login_url = 'http://example.com/'; var event_name = 'robwuniq' + Math.random().toString(16); // Unique name document.addEventListener(event_name, function localName() { document.removeEventListener(event_name, localName); // Clean-up // Your logic: Backbone.history.navigate('index', true); }); // Method 2b: Inject code which runs in the context of the page var actualCode = '(' + function(login_url, event_name) { var loginWin = window.open(login_url, 'LoginWindow', "width=655,height=490"); console.log(loginWin); // Check every 100 ms if the popup is closed. var finishedInterval = setInterval(function() { console.log('checking if loginWin closed'); if (loginWin.closed) { clearInterval(finishedInterval); console.log('popup is now closed'); // Notify content script var event = document.createEvent('Events'); event.initEvent(event_name, false, false); document.dispatchEvent(event); } }, 1000); } + ')(' + JSON.stringify(login_url+'') + ', "' + event_name + '")'; var script = document.createElement('script'); script.textContent = actualCode; (document.head||document.documentElement).appendChild(script); script.parentNode.removeChild(script);
使用
window.open()
从后台页面启动窗口.这将返回一个window
对象,该对象具有可靠的closed
属性.有关通信流程的更多详细信息,请参阅下一个要点.Launch the window from the background page using
window.open()
. This returns awindow
object which has a reliableclosed
property. See the next bullet point for more details on the communication flow.
相关文章