Javascript 用于在按下Ctrl+;在GitHub中的新问题页面的标题文本框中输入

Javascript 用于在按下Ctrl+;在GitHub中的新问题页面的标题文本框中输入,javascript,forms,greasemonkey,ctrl,modifier-key,Javascript,Forms,Greasemonkey,Ctrl,Modifier Key,(继续) 我一直在尝试制作一个脚本(使用Greasemonkey),每当我试图: 提交新版本,或 发表新评论 通过按Ctrl+Enter键: 如果用户在弹出窗口中按Ok,则脚本将允许提交, 但是,如果用户在弹出窗口中按取消,则脚本将停止提交 上面答案中的脚本在这些情况下工作正常 我注意到,还有另外一种提交问题的方式: 按Enter键或Ctrl+Enter键,同时将焦点放在问题标题文本框上 我也想用剧本来说明这一点 下面是我的代码。 如果我只是在新选项卡中打开新问题页面()uu(即,不通过单

(继续)

我一直在尝试制作一个脚本(使用Greasemonkey),每当我试图:

  • 提交新版本,或
  • 发表新评论
通过按Ctrl+Enter键:
如果用户在弹出窗口中按
Ok
,则脚本将允许提交,
但是,如果用户在弹出窗口中按
取消
,则脚本将停止提交

上面答案中的脚本在这些情况下工作正常


我注意到,还有另外一种提交问题的方式:
按Enter键或Ctrl+Enter键,同时将焦点放在问题标题文本框上

我也想用剧本来说明这一点

下面是我的代码。
如果我只是在新选项卡中打开新问题页面()uu(即,不通过单页应用程序工作流,也称为历史API)uu),则按Ctrl+Enter键时脚本也会工作

我仍然面临的问题是 如果我按照
新问题
按钮(即通过历史API)导航到新问题页面,
然后我要么按Ctrl+Enter,要么只在标题文本框中输入, 然后弹出窗口立即出现,但提交未被阻止

(function () {
    function init() {
        var targArea = document.querySelector('#issue_title'); // New issue title
        function manageKeyEvents(zEvent) {
            if (zEvent.ctrlKey && zEvent.keyCode === 13) {      // and the focused element is the issue title textbox
                if (confirm('Are you sure?') === false) {
                    zEvent.stopPropagation();
                    zEvent.preventDefault();
                // } else {
                    // var btn = document.querySelector('.btn-primary');                        // 'Submit new issue' button                
                    // btn.click();
                }
            }
        }
        if (targArea !== null) {targArea.addEventListener('keydown', manageKeyEvents);}
    }
    init();
    document.addEventListener('pjax:end', init); // for the History API
})();
STR:

  • 开放
  • 单击新发行的
    按钮(您将通过历史API重定向到
  • (您会注意到现在的焦点是问题标题文本框)
    键入123作为问题标题,并将焦点保持在问题标题文本框上(将问题正文留空)
  • 按Ctrl+Enter键(或只按Enter键)
  • 现在请注意,确认弹出窗口将立即出现,
    但提交不会被阻止
我的剧本怎么了


以下是GitHub的键盘快捷键列表供参考:,

当您在新发行页面中按?时会出现此问题。

我通过强制对
#发行(标题
元素进行不聚焦+重新聚焦来解决此问题:
打开“新问题”页面时,焦点位于“问题标题”文本框上。
由于某种原因,脚本不会阻止提交。但是,如果强制取消焦点并重新聚焦该元素(使用
blur()
(=unfocus)和
focus()
),则脚本会阻止提交

这是代码(始终在文档末尾运行)


下面是完整的用户脚本:

确认之前尝试阻止
,如果可以的话,直接调用表单的
提交()
,或者使用
调度事件
@wOxxOm:感谢您的帮助。因此,我尝试在
确认之前阻止
,但不幸的是,如果我将
manageKeyEvents(zEvent)
更改为现在有
if(zEvent.ctrlKey&&zEvent.keyCode==13){zEvent.stopPropagation();zEvent.preventDefault();
然后
如果(confirm====…)
则不会停止提交。是的,阻止对当前事件有效,因此需要添加“提交”侦听器。我猜您的脚本不是事件链中的第一个。请尝试使用
/@run at document start
,将提交侦听器附加到
文档
,并在其中检查当前event.target是否属于某个窗体,在这种情况下,可以防止事件发生。@wOxxOm:the
blur()
focus()
(在我下面的回答中)完全解决了这个问题。我删除了之前3条不相关的评论。
(function () {
    function init() {
        var targArea = document.querySelector('#issue_title'); // New issue title
        function manageKeyEvents(zEvent) {
            targArea.blur();
            targArea.focus();
            if ((zEvent.ctrlKey && zEvent.keyCode === 13) || zEvent.keyCode === 13) {
                if (confirm('Are you sure?') === false) {
                    zEvent.stopPropagation();
                    zEvent.preventDefault();
                } else {
                    var btn = document.querySelector('.btn-primary');  
                    btn.click();
                }
            }
        }
        if (targArea !== null) {targArea.addEventListener('keydown', manageKeyEvents);}
    }
    init();
    document.addEventListener('pjax:end', init); // for the History API
})();