Vanilla JS: полное отключение функции «сохранить» на веб-страницах - PullRequest
0 голосов
/ 21 октября 2018

Предположим, что я младший пользователь Википедии, который просто хочет поэкспериментировать с изменением некоторого содержимого Википедии с помощью текстового редактора Вики на странице редактирования, но никак не сохранять мои изменения (даже по ошибке), таким образом ищаспособ предотвратить сохранение любой функциональности на странице редактирования с помощью ванильного JavaScript.

Если я зайду на какую-то страницу редактирования в ивритской Википедии, я могу сохранить или опубликовать страницу, щелкнув мышью по кнопке Сохранить страницу ( иллюстрация ), которую яможно удалить из 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;
        }
    });
});

Код не удался (никакой специальной ошибки в консоли не выдается).Почему это не удалось?

Ответы [ 4 ]

0 голосов
/ 21 октября 2018

В вашем вопросе есть ряд проблем:

  • 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);
  1. Обратите внимание на true во втором прослушивателе событий.
  2. Обратите внимание, что evt.key сравнивается с заглавными буквами "s".
  3. Вы не можете запретить запуск прослушивателя событий, если он зарегистрирован на этапе захвата.(о фазах захвата и всплытия читайте здесь ).
0 голосов
/ 21 октября 2018

Все коды клавиш представляют клавиши-модификаторы.Событие keypress не запускается с этими ключами:

    document.addEventListener('keypress', function(e) {
    console.log('keypress worked');
    });

    document.addEventListener('keyup', function(e) {
    console.log('keyup worked');
    });

Также обратите внимание, что .keyCode устарело.Следует использовать .key

0 голосов
/ 21 октября 2018

Если вы можете узнать, какой метод вызывается после нажатия кнопки сохранения , может пригодиться следующий способ:

Мой рекомендуемый способ - нажать клавишу f12, а затем нажать кнопку сохранения.найти метод сохранения.Теперь, после завершения dom загрузки (в вашем коде), вы должны заменить полученную функцию пустой функцией, подобной этой:

FOUNDEDSaveFunc = function(){};

Если нажатие на кнопку сохранения приводит к обновлению, вы можете получить вызванную функцию.действие с некоторыми приложениями, такими как fiddler (вместо нажатия клавиши f12).


Кроме того, document.addEventListener добавляет нового слушателя к текущим существующим слушателям.Потому что эта основная функция, которая обрабатывает нажатие клавиш, и добавленная вами функция будут запускать обе функции (в этом случае все равно будет вызываться исходная функция сохранения).

0 голосов
/ 21 октября 2018

Нажав, вы можете предотвратить действие по умолчанию.

document.addEventListener('keypress', function(e) {
    if (event.keyCode == 16 && event.keyCode == 18 && event.keyCode == 83) {
           e.preventDefault();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...