(В продолжение этого ответа)
Я пытался создать скрипт (используя Greasemonkey), который показывал бы всплывающее окно подтверждения всякий раз, когда я пытаюсь:
- представить новый вопрос, или
- разместить новый комментарий.
нажатием Ctrl + Enter:
если пользователь нажимает Ok
во всплывающем окне, скрипт разрешает отправку,
но если пользователь нажимает Cancel
во всплывающем окне, скрипт останавливается представить.
Сценарий в ответе выше работает нормально в этих случаях.
Я заметил, что есть еще один способ отправить сообщение о проблеме:
нажмите Enter или Ctrl+Enter, удерживая фокус на текстовом поле названия проблемы< /сильный> .
Я также хотел бы покрыть это сценарием.
Ниже приведен мой код.
Если я просто открою страницу новой задачи (https://github.com/darkred/test/issues/new) в новой вкладке _(т.е. не через рабочий процесс одностраничного приложения, он же History API)_), то скрипт работает и при нажатии Ctrl+Ввод.
Проблема, с которой я все еще сталкиваюсь, заключается в том, что если я перехожу на страницу новой задачи, следуя New issue
кнопке (т.е. через History API),
а затем либо нажимаю Ctrl +Enter или просто 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
})();
СИЛ:
- откройте https://github.com/darkred/test/issues,
- нажмите кнопку
New Issue
(через History API вы будете перенаправлены на https://github.com/darkred/test/issues/new, - (Теперь вы заметите, что фокус находится на текстовом поле названия проблемы)
введите 123 в качестве названия проблемы и сохраните фокус на текстовом поле названия проблемы (оставьте тело проблемы пустым) , - нажмите Ctrl+Enter (или просто Enter),
- обратите внимание, что на мгновение появится всплывающее окно с подтверждением,
но отправка не будет заблокирована.
Что не так с моим сценарием?
Для справки, вот список сочетаний клавиш GitHub: скриншот,
который появляется когда вы нажимаете ? на новой странице выпуска.
confirm
и, если все в порядке, вызовите формуsubmit()
напрямую или используйтеdispatchEvent
. - person wOxxOm   schedule 09.08.2016confirm
, но, к сожалению, если я изменюmanageKeyEvents(zEvent)
на наличие сейчасif (zEvent.ctrlKey && zEvent.keyCode === 13) {zEvent.stopPropagation(); zEvent.preventDefault();
, а затемif (confirm === ..)
, это не остановит отправку. - person darkred   schedule 10.08.2016// @run-at document-start
и прикрепите прослушиватель отправки кdocument
, а внутри него проверьте, принадлежит ли текущий объект event.target форме, и в этом случае предотвратите событие. - person wOxxOm   schedule 11.08.2016blur()
иfocus()
(в моем ответе ниже) полностью решают проблему. Я удалил свои предыдущие 3 комментария как неактуальные. - person darkred   schedule 26.04.2017