Firefox webextension - 确认功能导致扩展弹出窗口立即关闭
Firefox webextension - confirm function causes extension popup to close immediately
我想将现有的功能齐全的 Chrome 扩展移植到 Firefox,除了 confirm()
函数行为。
当用户单击 popup.html 页面中的特定按钮时,系统会要求他确认该操作。
Chrome 成功提示对话框,然后单击 "ok" 或 "cancel" 按钮后立即返回布尔值,代码与返回的布尔值相关的被执行。
Firefox 另一方面,行为感觉有问题。确认对话框也会提示,但扩展弹出窗口会立即消失,从而阻止执行单击事件处理程序中的更多代码。
manifest.json : …, "default_popup": "popup.html", …
popup.html :
…
<script src="js/popup.js"></script>
</body>
popup.js :
removeButton.addEventListener('click', function () {
// Firefox: calling confirm() closes the popup.html page ...
// ... terminating event handler code
if (confirm("Please confirm you wish to remove this item.")) {
// …
}
});
有什么办法可以解决吗?还是我应该停止使用 confirm()
并找到解决方法?
编辑 - 解决方案
作为解决方法,我在单击按钮时设置了 3 秒倒计时,并每秒更改其标题。在时间到之前,如果用户再次点击,最后的动作被取消,否则执行最后的动作。
let log = document.querySelector('p')
,resetInterval = null
;
document.getElementById('resetbtn').addEventListener('click', function(e) {
if (!resetInterval) {
// Create a countdown and delete data when time is up.
e.target.content = e.target.innerHTML;
resetInterval = setInterval( function() {
var counter = +(e.target.innerHTML.trim().match(/\d+/)||[4])[0];
if (counter == 1) {
// Sending command to bacground page
// chrome.runtime.sendMessage({command:'remove'}, function (){
e.target.innerHTML = e.target.content;
resetInterval && clearInterval(resetInterval);
resetInterval = null;
log.innerHTML = 'Perform action…';
// });
} else e.target.innerHTML = 'Reset in '+(counter-1)+'s';
}, 1000);
log.innerHTML = '';
} else {
resetInterval && clearInterval(resetInterval);
e.target.innerHTML = e.target.content;
resetInterval = null;
log.innerHTML = 'Action aborted';
}
});
<button type="button" id="resetbtn">Reset</button>
<p></p>
弹出窗口 windows 设计为在您将焦点移至另一个 window 时关闭。您不能使用弹出窗口中的对话框(新 windows),因为它们会移动焦点并因此关闭弹出窗口。
我想将现有的功能齐全的 Chrome 扩展移植到 Firefox,除了 confirm()
函数行为。
当用户单击 popup.html 页面中的特定按钮时,系统会要求他确认该操作。
Chrome 成功提示对话框,然后单击 "ok" 或 "cancel" 按钮后立即返回布尔值,代码与返回的布尔值相关的被执行。
Firefox 另一方面,行为感觉有问题。确认对话框也会提示,但扩展弹出窗口会立即消失,从而阻止执行单击事件处理程序中的更多代码。
manifest.json : …, "default_popup": "popup.html", …
popup.html :
…
<script src="js/popup.js"></script>
</body>
popup.js :
removeButton.addEventListener('click', function () {
// Firefox: calling confirm() closes the popup.html page ...
// ... terminating event handler code
if (confirm("Please confirm you wish to remove this item.")) {
// …
}
});
有什么办法可以解决吗?还是我应该停止使用 confirm()
并找到解决方法?
编辑 - 解决方案
作为解决方法,我在单击按钮时设置了 3 秒倒计时,并每秒更改其标题。在时间到之前,如果用户再次点击,最后的动作被取消,否则执行最后的动作。
let log = document.querySelector('p')
,resetInterval = null
;
document.getElementById('resetbtn').addEventListener('click', function(e) {
if (!resetInterval) {
// Create a countdown and delete data when time is up.
e.target.content = e.target.innerHTML;
resetInterval = setInterval( function() {
var counter = +(e.target.innerHTML.trim().match(/\d+/)||[4])[0];
if (counter == 1) {
// Sending command to bacground page
// chrome.runtime.sendMessage({command:'remove'}, function (){
e.target.innerHTML = e.target.content;
resetInterval && clearInterval(resetInterval);
resetInterval = null;
log.innerHTML = 'Perform action…';
// });
} else e.target.innerHTML = 'Reset in '+(counter-1)+'s';
}, 1000);
log.innerHTML = '';
} else {
resetInterval && clearInterval(resetInterval);
e.target.innerHTML = e.target.content;
resetInterval = null;
log.innerHTML = 'Action aborted';
}
});
<button type="button" id="resetbtn">Reset</button>
<p></p>
弹出窗口 windows 设计为在您将焦点移至另一个 window 时关闭。您不能使用弹出窗口中的对话框(新 windows),因为它们会移动焦点并因此关闭弹出窗口。