在 GitHub 中通过按 Ctrl+Enter(built-in 热键)提交问题或发表评论时创建确认弹出窗口的用户脚本
Userscript for creating a confirmation popup whenever submitting an issue or posting a comment via pressing Ctrl+Enter(the built-in hotkey) in GitHub
测试URL:https://github.com/darkred/test/issues/new
GitHub 允许在 public 回购的问题区域:
- 提交一个只有 1 个字符作为标题且没有 body 的新问题,并且
- post仅需 1 个字符的评论。
以上情况经常发生在我身上,因为 'submiting an issue or comment' 的 build-in 热键是 Ctrl + Enter:我不小心在我之前按了那个键盘快捷键issue/comment 文本已准备就绪。
所以,我正在尝试制作一个脚本(使用 Greasemonkey),每当我尝试时都会显示一个确认弹出窗口:
- 提交新问题,或
- post一条评论
通过按 Ctrl + Enter:
如果用户在弹出窗口中按下 Ok,则脚本允许提交,
但是如果用户在弹出窗口中按下 Cancel,那么脚本将停止提交。
我遇到过这两种方法:
在 Brock Adams 的有用评论之后,我有以下代码:
var targArea_1 = document.querySelector('#issue_body'); // New issue textarea
var targArea_2 = document.querySelector('#new_comment_field'); // New comment textarea
function manageKeyEvents (zEvent) {
if (zEvent.ctrlKey && zEvent.keyCode == 13) { // If Ctrl+Enter is pressed
if (confirm('Are you sure?') == false) { // If the user presses Cancel in the popup
zEvent.stopPropagation(); // then it stops propagation of the event
zEvent.preventDefault(); // and cancels/stops the submit submit action bound to Ctrl+Enter
}
}
}
if (targArea_1 !== null) {targArea_1.addEventListener('keydown', manageKeyEvents);}
if (targArea_2 !== null) {targArea_2.addEventListener('keydown', manageKeyEvents);}
现在,每当我按下 Ctrl + Enter.
时,弹出窗口就正常了
问题是在弹窗中按确定时issue/comment没有提交(即使我没有按Cancel 在弹出窗口之前,完全没有)。如何解决这个问题?
还有,在弹窗中按了一次取消后,如何re-allowissue/comment提交?
换句话说:如何在 preventDefault() 之后 re-enable 默认值?
基于用户trespassersW的帮助here (非常感谢他)
即我的代码缺少 else
分支:
if (confirm('Are you sure?') == false) {
// ...
} else {
var btn = document.querySelector("#partial-new-comment-form-actions button");
if (btn) btn.click();
}
那是因为 confirm
消息框清除了键盘事件队列。
(因此 click 'Ok'
动作必须由脚本完成)。
这是一个完整的工作脚本:
// ==UserScript==
// @nameGitHub Confirm Create and Close issues
// @include https://github.com/*
// @grant none
// ==/UserScript==
(function () { // Self-Invoking function
function init() {
// For submitting issues in issue body textarea via Ctrl+Enter
var targArea1 = document.querySelector('#issue_body'); // New issue textarea
function manageKeyEvents1(zEvent) {
if (zEvent.ctrlKey && zEvent.keyCode === 13) {
if (confirm('Are you sure?') === false) {
zEvent.stopPropagation();
zEvent.preventDefault();
} else {
var btn1 = document.querySelector('.btn-primary');
if (btn1) {btn1.click();}
}
}
}
if (targArea1 !== null) { targArea1.addEventListener('keydown', manageKeyEvents1); }
// ------------------------------------------------------------------------------------------------
// For submitting issues in new comment textarea via Ctrl+Enter
var targArea2 = document.querySelector('#new_comment_field'); // New comment textarea
function manageKeyEvents2(zEvent) {
if (zEvent.ctrlKey && zEvent.keyCode === 13) {
if (confirm('Are you sure?') === false) {
zEvent.stopPropagation();
zEvent.preventDefault();
} else {
var btn2 = document.querySelector('#partial-new-comment-form-actions button');
if (btn2) {btn2.click();}
}
}
}
if (targArea2 !== null) { targArea2.addEventListener('keydown', manageKeyEvents2); }
}
// Page load
init();
// On pjax (because GitHub uses the History API)
document.addEventListener('pjax:end', init);
})();
测试URL:https://github.com/darkred/test/issues/new
GitHub 允许在 public 回购的问题区域:
- 提交一个只有 1 个字符作为标题且没有 body 的新问题,并且
- post仅需 1 个字符的评论。
以上情况经常发生在我身上,因为 'submiting an issue or comment' 的 build-in 热键是 Ctrl + Enter:我不小心在我之前按了那个键盘快捷键issue/comment 文本已准备就绪。
所以,我正在尝试制作一个脚本(使用 Greasemonkey),每当我尝试时都会显示一个确认弹出窗口:
- 提交新问题,或
- post一条评论
通过按 Ctrl + Enter:
如果用户在弹出窗口中按下 Ok,则脚本允许提交,
但是如果用户在弹出窗口中按下 Cancel,那么脚本将停止提交。
我遇到过这两种方法:
在 Brock Adams 的有用评论之后,我有以下代码:
var targArea_1 = document.querySelector('#issue_body'); // New issue textarea
var targArea_2 = document.querySelector('#new_comment_field'); // New comment textarea
function manageKeyEvents (zEvent) {
if (zEvent.ctrlKey && zEvent.keyCode == 13) { // If Ctrl+Enter is pressed
if (confirm('Are you sure?') == false) { // If the user presses Cancel in the popup
zEvent.stopPropagation(); // then it stops propagation of the event
zEvent.preventDefault(); // and cancels/stops the submit submit action bound to Ctrl+Enter
}
}
}
if (targArea_1 !== null) {targArea_1.addEventListener('keydown', manageKeyEvents);}
if (targArea_2 !== null) {targArea_2.addEventListener('keydown', manageKeyEvents);}
现在,每当我按下 Ctrl + Enter.
时,弹出窗口就正常了
问题是在弹窗中按确定时issue/comment没有提交(即使我没有按Cancel 在弹出窗口之前,完全没有)。如何解决这个问题?
还有,在弹窗中按了一次取消后,如何re-allowissue/comment提交?
换句话说:如何在 preventDefault() 之后 re-enable 默认值?
基于用户trespassersW的帮助here (非常感谢他)
即我的代码缺少 else
分支:
if (confirm('Are you sure?') == false) {
// ...
} else {
var btn = document.querySelector("#partial-new-comment-form-actions button");
if (btn) btn.click();
}
那是因为 confirm
消息框清除了键盘事件队列。
(因此 click 'Ok'
动作必须由脚本完成)。
这是一个完整的工作脚本:
// ==UserScript==
// @nameGitHub Confirm Create and Close issues
// @include https://github.com/*
// @grant none
// ==/UserScript==
(function () { // Self-Invoking function
function init() {
// For submitting issues in issue body textarea via Ctrl+Enter
var targArea1 = document.querySelector('#issue_body'); // New issue textarea
function manageKeyEvents1(zEvent) {
if (zEvent.ctrlKey && zEvent.keyCode === 13) {
if (confirm('Are you sure?') === false) {
zEvent.stopPropagation();
zEvent.preventDefault();
} else {
var btn1 = document.querySelector('.btn-primary');
if (btn1) {btn1.click();}
}
}
}
if (targArea1 !== null) { targArea1.addEventListener('keydown', manageKeyEvents1); }
// ------------------------------------------------------------------------------------------------
// For submitting issues in new comment textarea via Ctrl+Enter
var targArea2 = document.querySelector('#new_comment_field'); // New comment textarea
function manageKeyEvents2(zEvent) {
if (zEvent.ctrlKey && zEvent.keyCode === 13) {
if (confirm('Are you sure?') === false) {
zEvent.stopPropagation();
zEvent.preventDefault();
} else {
var btn2 = document.querySelector('#partial-new-comment-form-actions button');
if (btn2) {btn2.click();}
}
}
}
if (targArea2 !== null) { targArea2.addEventListener('keydown', manageKeyEvents2); }
}
// Page load
init();
// On pjax (because GitHub uses the History API)
document.addEventListener('pjax:end', init);
})();