Предположим, что я младший пользователь Википедии, который просто хочет поэкспериментировать с изменением какого-либо википедического контента с помощью текстового редактора Wiki на странице редактирования, но никоим образом не сохраняя мои изменения (даже не по ошибке), тем самым стремясь предотвратить любые функции сохранения на странице редактирования через ванильный JavaScript.
Если я перейду на какую -либо страницу редактирования на иврите Wikipedia, я могу сохранить или опубликовать страницу, щелкнув мышью кнопку "Сохранить страницу" (иллюстрация), которую я смогу удалить из DOM с помощью:
document.querySelector("#wpSave").remove();
Но предположим, что я все еще могу сохранить или опубликовать контент alt+shift+s, и я хотел бы предотвратить это возможное поведение сохранения; Я попробовал следующий код:
// ==UserScript==
// @name wiki
// @match https://*.wikipedia.org/*
// ==/UserScript==
document.addEventListener("DOMContentLoaded", ()=>{
document.addEventListener('keypress', function(e) {
if (e.key == 16 && e.key == 18 && e.key == 83) {
return false;
}
});
});
Код не удался (в консоли не указана специальная ошибка). Почему это не удалось?
В вашем вопросе есть ряд проблем:
event.key
не совпадает с event.keyCode
, см. документацию.e.key == 16 && e.key == 18 && e.key == 83
никогда не будет правдой.false
из прослушивателя событий не останавливает распространение события.То, что вы пытаетесь сделать, может быть достигнуто следующим образом:
document.addEventListener("keypress", evt => {
// refer to https://stackoverflow.com/a/2878005/8746648
if(evt.altKey && evt.key == "S") {
alert("prevent this message");
evt.preventDefault();
}
});
// refer to https://stackoverflow.com/a/35611393/8746648
document.addEventListener("keypress", evt => {
if(evt.altKey && evt.key == "S") {
evt.stopPropagation();
}
}, true);
true
во втором прослушивателе событий.evt.key
сравнивается с верхним регистром "s".Если вы можете узнать, какой метод вызывается после нажатия кнопки "Сохранить", то способ, который может быть полезен ниже:
Мой предложенный способ - нажать f12, а затем нажать кнопку "Сохранить", чтобы найти способ сохранения. Теперь, после завершения загрузки dom
(в вашем коде), вы должны заменить полученную функцию пустой функцией следующим образом:
FOUNDEDSaveFunc = function(){};
Если щелчок по кнопке сохранения приводит к обновлению, вы можете получить это действие с помощью некоторых приложений, таких как fiddler
(вместо нажатия f12).
Кроме того, document.addEventListener
добавляет новый прослушиватель к существующим существующим listeneres. Потому что это, основная функция, которая обрабатывает нажатие клавиши, и вашу добавленную функцию, будут запускать оба (в этом случае будет выполняться функция сохранения в памяти).
Ключи KeyCodes представляют собой ключи-модификаторы. Событие keypress
не срабатывает с этими клавишами:
document.addEventListener('keypress', function(e) {
console.log('keypress worked');
});
document.addEventListener('keyup', function(e) {
console.log('keyup worked');
});
Также обратите внимание, что .keyCode
устарел. Должен использовать .key
document.addEventListener('keypress', function(e) { if (e.key == 16 && e.key == 18 && e.key == 83) { e.preventDefault(); } });
Onclick вы можете предотвратить действие по умолчанию.
document.addEventListener('keypress', function(e) {
if (event.keyCode == 16 && event.keyCode == 18 && event.keyCode == 83) {
e.preventDefault();
}
});
e.preventDefault();
также.
Alt+Shift+S
так что, похоже, он не работает.