У меня есть проблема с открытием новой вкладки из моего всплывающего окна после нажатия кнопки. До сих пор мое тестирование показало, что я могу открыть новую вкладку после нажатия кнопки, но как только я попытаюсь сделать это из .then()
моего вызова в browser.tabs.query()
, тот же код больше не работает,
Это изюминка соответствующего раздела кода (из popup/menu.js ниже):
// Getting the currently active tab
var gettingActiveTab = browser.tabs.query({active: true, currentWindow: true});
gettingActiveTab.then((tabs) => {
// Open desired tab. This fails for some reason?
var creating = browser.tabs.create({
url:"https://stackoverflow.com/users/641534/antonchanning"
});
creating.then(onCreated, onError);
});
//test to show we can actually open a tab successfully. This works...
var creating = browser.tabs.create({
url:"https://stackexchange.com/users/322227/antonchanning"
});
creating.then(onCreated, onError);
В конечном счете, я планирую получить URL-адрес активной активной вкладки, и это изменит назначение новой открытой вкладки. В конечном итоге этот план предусматривает добавление, которое может переключаться между зеркальными веб-сайтами, имеющими один и тот же контент, даже если текущий сайт не работает (из-за высокого трафика).
manifest.json:
{
"manifest_version": 2,
"name": "New tab test",
"version": "1.0",
"description": "Demonstrating an issue getting a new tab to open from a certain context.",
"icons": {
"48": "icons/newtab_48.png"
},
"permissions": [
"activeTab"
],
"browser_action": {
"default_icon": "icons/newtab_32.png",
"default_title": "New tab test",
"default_popup": "popup/menu.html"
}
}
всплывающее окно /menu.html:
<!doctype html>
<html lang="en">
<head>
<title>New tab example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width" initial-scale="1.0">
<link rel="stylesheet" type="text/css" href="menu.css">
</head>
<body>
<div>
<h1>Example</h1>
<h2><strong>Open:</strong></h2>
<div>
<span href="https://stackexchange.com" title="steemdb" class="opennewtab"><img src="/icons/wrench-go.png" title="steemdb" class="flowLeft">New tab 1</span>
<span href="https://stackoverflow.com" title="steemd" class="opennewtab"><img src="/icons/wrench-go.png" title="steemd" class=flowLeft>New tab 2</span>
</div>
</div>
<script language="javascript" src="menu.js"></script>
</body>
</html>
всплывающее окно /menu.css:
html div{
background-color: #FAFAFA;
width: 160px;
margin: auto;
border-style: solid;
border-color:#EFF2FB;
border-width: 1px;
border-radius:5px;
padding: 0.5em;
align-content: center;
}
h1{
line-height: 2em;
font: 100% Verdana, Geneva, sans-seriff;
font-style: normal;
color:#58ACFA;
margin-bottom: 0.5em;
text-align: center;
text-transform: uppercase;
}
h2{
line-height: 1em;
font: 100% Verdana, Geneva, sans-seriff;
font-style: normal;
color:#A4A4A4;
margin-bottom: 0.5em;
text-indent: 1em;
clear:right;
}
.opennewtab{
color: #045FB4;
font:0.9em Verdana, Geneva, sans-seriff;
display:block;
text-indent: 2em;
text-decoration:none;
margin-bottom: 0.5em;
background-color: #EFF2FB;
border:1px solid #A9BCF5;
padding: 0.5em;
border-radius: 3px;
}
.opennewtab:hover{
color: #136;
background: #def;
}
ul{
list-style-type:none;
}
img{
margin-right: 5px;
}
img.logo{
float: right;
margin-left:0.2em;
}
hr{
border-style:solid;
border-color:#F0F0F0;
}
Всплывающие /menu.js:
function onCreated(tab) {
console.log('Created new tab: ${tab.id}')
}
function onError(error) {
console.log('Error: ${error}');
}
document.addEventListener("click", (e) => {
if (e.target.classList.contains("opennewtab")) {
var gettingActiveTab = browser.tabs.query({active: true, currentWindow: true});
gettingActiveTab.then((tabs) => {
// Open desired tab. This fails for some reason?
var creating = browser.tabs.create({
url:"https://stackoverflow.com/users/641534/antonchanning"
});
creating.then(onCreated, onError);
});
//test to show we can actually open a tab successfully
var creating = browser.tabs.create({
url:"https://stackexchange.com/users/322227/antonchanning"
});
creating.then(onCreated, onError);
}
window.close();
});
Чтобы загрузить полный код тестового примера, включая значки, загрузите ZIP из этого репозитория GitHub и добавьте его как временное дополнение через вкладку about:debugging
.
Она не работает, потому что вы window.close()
ваше всплывающее окно перед выполнением browser.tabs.create()
в .then()
для browser.tabs.query()
. browser.tabs.query()
является асинхронным. Функция .then()
не выполняется немедленно. Когда вы закрываете всплывающее окно, контекст уничтожается, и выполнение останавливается. Таким образом, .then()
не существует для вызова.
Если вы хотите закрыть всплывающее окно после создания вкладки, тогда окно window.close()
необходимо выполнить после открытия вкладки.
Это было бы примерно так:
function onCreated(tab) {
console.log('Created new tab: ${tab.id}')
window.close();
}
function onError(error) {
console.log('Error: ${error}');
window.close();
}
document.addEventListener("click", (e) => {
if (e.target.classList.contains("opennewtab")) {
browser.tabs.query({active: true, currentWindow: true}).then((tabs) => {
browser.tabs.create({
url:"https://stackoverflow.com/users/641534/antonchanning"
}).then(onCreated, onError);
});
}
});
browser.tabs.query
был асинхронным. Хорошо знать.