Vanilla JS: полное отключение функции «сохранить» на веб-страницах

1

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

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

Теги:
dom
keyboard-shortcuts
events
return

4 ответа

1

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

  • 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
    Я протестировал код на консоли, на экране редактирования иврит-вики, но все еще мог сохранить страницу с помощью Alt+Shift+S так что, похоже, он не работает.
  • 0
    Если вы приняли код правильно, я не думаю, что вы можете многое сделать сейчас. Если у вас есть возможность, вы можете попробовать что-то, работающее за пределами Chrome ...
0

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

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

FOUNDEDSaveFunc = function(){};

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


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

0

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

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

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

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

  • 0
    К сожалению, это не сработало --- document.addEventListener('keypress', function(e) { if (e.key == 16 && e.key == 18 && e.key == 83) { e.preventDefault(); } });
  • 0
    Перечитай ответ пожалуйста. Проблема заключается в нажатии клавиш .
Показать ещё 1 комментарий
0

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

document.addEventListener('keypress', function(e) {
    if (event.keyCode == 16 && event.keyCode == 18 && event.keyCode == 83) {
           e.preventDefault();
    }
});
  • 0
    К сожалению, это не работает с e.preventDefault(); также.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню