2016-08-09 7 views
2

(В продолжении this answer)Userscript для создания всплывающего окна подтверждения всякий раз, нажав Ctrl + Enter или Enter в заголовке текстового поля новой страницы выпуска в GitHub

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

  • представить новый выпуск, или
  • добавить новый комментарий.

с помощью нажатия Ctrl + Enter:
, если пользователь нажимает Ok во всплывающем окне, то сценарий, чтобы позволить представить
но если пользователь нажимает Cancel во всплывающем окне, то сценарий, чтобы остановить Отправить.

Скрипт в ответе выше работает нормально в этих случаях.


Я заметил, что есть дополнительный способ представить вопрос:
нажмите Enter или Ctrl + Enter, имея фокус на вопрос в заголовке текстового поля.

Я хотел бы также учесть это сценарием.

Ниже приведен мой код.
, если я просто открыть новую страницу выпуска (https://github.com/darkred/test/issues/new) в новой вкладке _ (то есть. Не с помощью рабочего процесса приложения одной страницы, ака History API) _), то скрипт работает при нажатии Ctrl + Enter.

Проблема, которую я до сих пор является то, что если я перейти на новую страницу выдачи через после New issue кнопку (т.е. через History 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:

  • открыт https://github.com/darkred/test/issues,
  • нажмите кнопку New Issue (вы получите перенаправлены через History API к https://github.com/darkred/test/issues/new,
  • (Вы заметите фокус прямо сейчас находится в текстовом поле заголовка вопроса)
    тип 123 как заголовок темы и держать фокус на текстовом поле заголовка проблемы (оставьте Sue тело пусто),
  • нажмите Ctrl + Enter (или просто Enter)
  • Теперь обратите внимание, что всплывающее окно подтверждения появится на мгновение,
    , но представить не будет заблокирован.

Что случилось с моим скриптом?


Для справки здесь приведен список список Сочетания клавиш в GitHub в: screenshot,
, который появляется при нажатии? в новой странице вопросов.

+1

Попробуйте предупреждения перед 'confirm', и если okay'd , 'submit()' непосредственно в форме вызова или использовать 'dispatchEvent'. – wOxxOm

+0

@wOxxOm: Спасибо, что постарались помочь. Итак, я попытался предотвратить до 'confirm', но, к сожалению, если я изменил' manageKeyEvents (zEvent) 'на наличие теперь' if (zEvent.ctrlKey && zEvent.keyCode === 13) {zEvent.stopPropagation(); zEvent.preventDefault(); ', а затем' if (confirm === ..) ', то это не останавливает отправку. – darkred

+1

Да, предотвращение работ для текущего события, поэтому вам нужно добавить слушателя «submit». – wOxxOm

ответ

0

мне удалось решить эту путем заставляя unfocus + переориентировать на #issue_title элементе:
при открытии новой страницы выпуска, акцент делается на титульном вопрос текстового поля.
Сценарий по какой-то причине не блокирует отправку. Но, если вы принудительно не фокусируете и перефокусируете этот элемент (используя blur() (= unocus) и focus()), тогда скрипт блокирует отправку.

Вот код (всегда // @run-at document-end)

(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 
})(); 


А вот полный userscript:
GitHub - Confirmations before submitting issues and comments