Пользовательский скрипт для создания всплывающего окна с подтверждением при отправке проблемы или публикации комментария с помощью нажатия Ctrl+Enter(встроенная горячая клавиша) в GitHub

Тестовый URL: https://github.com/darkred/test/issues/new

GitHub позволяет в области вопросов для публичного репо:

  • отправка нового номера, содержащего только 1 символ в качестве заголовка и без текста, и
  • оставив комментарий только с 1 символом.

Вышесказанное случается со мной довольно часто, потому что встроенная горячая клавиша для "отправки вопроса или комментария" - это Ctrl + Enter: я случайно нажимаю эту комбинацию клавиш до того, как текст моей проблемы / комментария будет готов.


Итак, я пытаюсь создать сценарий (используя Greasemonkey), который будет отображать всплывающее окно с подтверждением всякий раз, когда я пытаюсь:

  • отправить новый номер или
  • оставить комментарий

нажав Ctrl + Enter:
если пользователь нажимает Ok во всплывающем окне, то скрипт, разрешающий отправку,
но если пользователь нажимает кнопку " Отмена" во всплывающем окне, тогда скрипт останавливает отправку.


Я сталкивался с этими двумя подходами:
После полезного комментария Брока Адамса у меня есть следующий код:

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.
Проблема в том, что проблема / комментарий не передаются при нажатии Ok во всплывающем окне (даже если я вообще не нажимал Отмена во всплывающем окне). Как это исправить?
И, как повторно разрешить отправку вопроса / комментария после того, как я нажал Отмена во всплывающем окне один раз?
Другими словами: как повторно включить default после protectDefault()?

1 ответ

Решение

Основываясь на помощи пользователя trespassersW здесь (я благодарю его)
то есть что в моем коде отсутствовал 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);

})();
Другие вопросы по тегам