如何解决当我点击我用 tampermonkey 添加到它的按钮时,如何阻止 gmail 打开电子邮件?
我做了这个 tampermonkey 脚本来解析我的 gmail 收件箱项目并添加一个链接到我们的 Redmine 问题跟踪器的按钮,这样我就可以打开线程而无需打开电子邮件。我添加了这个按钮,立即打开一个新选项卡并将焦点切换到它。
它工作正常,除了每次我单击按钮时,它还会在 Gmail 页面/浏览器选项卡上打开电子邮件。为了解决这个问题,我添加了一个 setTimeout(function() { window.history.go(-1); },1000)
以在打开链接后跳回。
问题是这不允许我同时打开多个问题,即按住 Ctrl+Click
,因为它会打开电子邮件并跳回(大闪烁)。
我尝试将超时设置为 0,即 setTimeout(function() { window.history.go(-1); },0)
,但这无济于事,因为 GMail 会在当前浏览器标签页/页面和新页面(以及我的 Redmine 页面)中打开电子邮件,然后当我点击带有 Ctrl+Click
的按钮时,我打开了 2 个新页面。
- 有什么我可以添加到
setTimeout(...,0)
的东西,它可以在电子邮件开始之前取消它吗? (这样我就可以通过按住Ctrl
按钮一次打开多个标签页) - 或者,当我点击刚刚添加的按钮时,有没有办法从打开电子邮件中删除点击事件? (这样我就可以通过按住
Ctrl
按钮一次打开多个标签页)
// ==UserScript==
// @name GMail Redmine Link to Redmine
// @namespace *
// @version 0.1
// @description Redmine button to jump directly to redmine thread
// @author user
//
// @include https://mail.google.com/*
// @require http://code.jquery.com/jquery-3.4.1.min.js
// ==/UserScript==
(function() {
'use strict';
let keepclosing = async () => {
let elementid = `div[role="link"] span[data-thread-id]`;
let viewedbar = $(elementid).not('span[data-donot-process-this-again]');
if(viewedbar.length)
{
$(viewedbar).each(function(index,item)
{
let newitem = $(item).text();
let redmineregex = /\#(\d+)/g;
let regeresult = redmineregex.exec(newitem);
if(regeresult && regeresult.length) {
let redminecase = regeresult[1];
let prevIoUsItem = function() {
window.open(`https://redmine.com/issues/${redminecase}`);
setTimeout(function() { window.history.go(-1); },1000);
return false;
};
let mybutt = document.createElement("input");
mybutt.type = "button";
mybutt.id = `OpenRedmineCaseButton${redminecase}`;
mybutt.value = `#${redminecase}`;
mybutt.onclick = prevIoUsItem;
$($($($(item).parent()).parent()).parent()).prepend(mybutt);
}
$(item).attr('data-donot-process-this-again',true);
})
}
setTimeout(keepclosing,500);
}
setTimeout(keepclosing,500);
})();
观察:我发布的图片有颜色,因为完整的代码也有一部分我删除了以简化问题:
let LatestIssues = 44000;
...
let casenumber = parseInt(redminecase);
if( casenumber > LatestIssues ) {
mybutt.style.background = '#ffe0e0';
}
else if( casenumber > LatestIssues - 2000 ) {
mybutt.style.background = '#faffd4';
}
else {
mybutt.style.background = '#cfe9ff';
}
// This is something I used to add the button more above,but did not worked
// $($($($($($($(item).parent()).parent()).parent()).parent()).parent()).parent()).prepend(mybutt);
解决方法
简单地阻止事件传播到行上 Gmail 的点击侦听器即可:
let previousItem = function(e) {
e.stopPropagation();
window.open(`https://redmine.com/issues/${redminecase}`);
};
IMO,更简单的方法是:
'use strict';
const processed = new Set();
const addButtons = () => {
const parentSelector = `div[role="link"] > div`;
for (const parent of document.querySelectorAll(parentSelector)) {
const row = parent.children[0];
if (processed.has(row)) continue;
processed.add(row);
const caseNumber = row.querySelector('span[data-thread-id]')?.textContent.match(/$(\d+)/)?.[1];
if (!caseNumber) continue;
const button = row.insertAdjacentElement('afterbegin',document.createElement('input'));
button.type = 'button';
button.onclick = (e) => {
e.stopPropagation();
window.open(`https://redmine.com/issues/${caseNumber}`);
};
button.value = `#${caseNumber}`;
}
};
setInterval(addButtons,500);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。