Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何关闭使用browser.windows.create()打开的窗口?_Javascript_Firefox Addon Webextensions - Fatal编程技术网

Javascript 如何关闭使用browser.windows.create()打开的窗口?

Javascript 如何关闭使用browser.windows.create()打开的窗口?,javascript,firefox-addon-webextensions,Javascript,Firefox Addon Webextensions,我找不到解决此问题的任何问题/答案。对不起,我错过了什么 我刚刚开始使用WebExtensions。我有一个窗体,它显示在我使用windows.create()在background.js脚本中打开的窗口中。我不知道如何关闭该窗口(手动单击关闭框除外)。窗口已创建并正确显示我的表单。我甚至可以提交表格。但是我不能让窗户关上。我甚至尝试过在表单页面中注入内容脚本——我也无法从那里关闭它。我尝试将处理程序附加到按钮的单击事件上,但没有成功 据我所知,只有创建窗口的脚本才能关闭窗口。但我无法通过在线搜

我找不到解决此问题的任何问题/答案。对不起,我错过了什么

我刚刚开始使用WebExtensions。我有一个窗体,它显示在我使用
windows.create()在background.js脚本中打开的窗口中。我不知道如何关闭该窗口(手动单击关闭框除外)。窗口已创建并正确显示我的表单。我甚至可以提交表格。但是我不能让窗户关上。我甚至尝试过在表单页面中注入内容脚本——我也无法从那里关闭它。我尝试将处理程序附加到按钮的
单击事件上,但没有成功

据我所知,只有创建窗口的脚本才能关闭窗口。但我无法通过在线搜索找出,或者在我的
browserAction
background脚本(创建窗口的地方)中如何做到这一点

我正在Debian上运行Firefox51

下面是创建窗口的代码

background.js

var formUrl='1http://example.com/api/test'
chrome.browserAction.onClicked.addListener(
功能(选项卡)
{
chrome.tabs.query({“active”:true,“currentWindow”:true},函数(tabs)
{ 
var target=tabs[0]。url;
if(target.substr(0,4)='http')
{
var encUrl=escape(目标);
var newUrl=formUrl+'?默认值='+encUrl;
w=chrome.windows.create({
url:newUrl,
宽度:775,
身高:350,
键入:“弹出窗口”
});
}
其他的
{
log(“此时只能处理http(s)页面”);
}
});
}
);
API调用专门用于关闭窗口。您将需要
windowId
,该窗口ID在对象中可用,该对象被传递到回调/解析函数以进行调用


您不需要从打开窗口的同一脚本中调用
windows.remove()
。任何可以访问该API的脚本都可以关闭窗口。

您可以通过以下方式从“关闭”按钮中删除由Firefox中的扩展创建的窗口:

GetEl('dismiss').addEventListener('click',function(e)
    {
    browser.windows.getCurrent().then(F2);
    });
function F2(info)
    {
    return browser.windows.remove(info.id);
    } // F2

(GetEl返回给定id字符串的元素节点。)

感谢您的响应。我想我错过了整个“承诺”的事情。我现在可以访问后台脚本中的窗口id,但不能访问新打开窗口(webextension的一部分)中加载到表单中的脚本中的窗口id。我想做的是在单击窗口窗体中的按钮时关闭该窗口,因此我想在该按钮的onclick上附加一个处理程序。我一点也不清楚如何做到这一点——我在哪里可以同时访问表单元素和窗口id?@Laz:简短回答:根据设计,没有任何地方;你必须使用。(续)@Laz:后台所有脚本共享相同的上下文,但作用域不同。这意味着,在获得对其作用域的引用后,您可以直接调用函数/访问变量/访问DOM/等,用于显示扩展页、选项页、背景页/脚本的任何弹出窗口或选项卡。因此,在哪里可以访问窗口ID并调用
windows
API的答案是:从后台上下文中的任何位置。(续)@Laz:然而,你的"弹出窗口"实际上是一个窗口,显示的标签是一个内容页。从编程角度讲,这与显示选项卡的普通浏览器窗口几乎相同,只是看起来有所不同。您正在打开一个远程页面,我假设您在其中插入了一个内容脚本(问题中未显示)。该脚本将在内容脚本上下文中运行,而不是在后台运行。(续)@Laz:您需要从该内容脚本到后台页面,请求关闭弹出窗口。显然,您也可以向内容脚本发送带有窗口ID的消息,但内容脚本无权访问
windows
API,因此无法关闭窗口。因此,您的问题的答案是:根据设计,没有任何地方既可以访问内容页的DOM,也可以访问关闭窗口所需的
chrome.windows
API。