我有基于内容脚本的 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
是未定义.frames[0]
and frames['frameName']
, (normally referring to the the frame's containing global window
object) is undefined
.var iframe = document.getElementById('frameName');
iframe.contentDocument
returns a document
object of the containing frame, because content scripts have access to the DOM of a page. This property is null
when the Same origin policy applies.iframe.contentDocument.defaultView
(refers to the window
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 a Window
instance (neither does window.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 a window
object which has a reliable closed
property. See the next bullet point for more details on the communication flow.
这篇关于window.open 在 chrome 扩展中返回 undefined的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!