Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Отключить сохранение при комбинации Ctrl + S (https://javascript.ru/forum/misc/79902-otklyuchit-sokhranenie-pri-kombinacii-ctrl-s.html)

MC-XOBAHCK 05.04.2020 17:52

Отключить сохранение при комбинации Ctrl + S
 
Здравствуйте!
Мне нужно при комбинации клавишь Ctrl + S отключить сохранение страницы браузера, а вместо этого вызвать свой метод.

Пока сделал такую структуру кода и остановился на отключении сохранения страницы:
const app = {
    event() {
        document.addEventListener('keydown', this.keyboard.bind(this));
    },

    keyboard(e) {
        function listenerS(e) {
            if (e.code === 'KeyS') {
                this.save_options();
            }
            else document.removeEventListener('keyup', listenerS.bind(this));
        }
        
        if (e.key === 'Control') {
            document.addEventListener('keyup', listenerS.bind(this));
        }
    },

    save_options() {
        // ...Метод вызываемый при нажатии Ctrl + S
    }
}

app.event();

Собственно вопрос: как отключить сохранение при комбинации Ctrl+S ?

Так же прошу подсказать и наставить на путь истинный по вопросу какие клавиши добавить не для Windows систем. В общем задача такая чтобы при нажатии Ctrl + S (или равнозначной комбинации в др. осях) вызывать свой метод, а не сохранение страницы.

voraa 05.04.2020 22:26

Как то сложновато все.
А почему не просто

document.addEventListener('keydown', (ev) => {
	if (ev.code == 'KeyS' && ev.ctrlKey) {
		ev.preventDefault();
		save_options();    // alert ('Ctrl+S')
	}
  });


В любом случае ev.preventDefault()

MC-XOBAHCK 06.04.2020 07:20

Цитата:

Сообщение от voraa
В любом случае ev.preventDefault()

Спасибо! Теперь работает, косяков не вижу:
const app = {
    event() {
        document.addEventListener('keydown', this.keyboard.bind(this));
    },

    keyboard(e) {
        if (e.code == 'KeyS' && e.ctrlKey) {
            e.preventDefault();

            this.save_options();
        }
    },

    save_options() {
        // ...Метод вызываемый при нажатии Ctrl + S
    }
}

app.event();


А для Мас не подскажите, там вроде кнопки Ctrl нету, а вместо неё кнопка Cmd (если не ошибаюсь).
Как эту кнопку правильно прописать?

voraa 06.04.2020 07:28

Цитата:

Сообщение от MC-XOBAHCK (Сообщение 522304)
А для Мас не подскажите, там вроде кнопки Ctrl нету, а вместо неё кнопка Cmd (если не ошибаюсь).
Как эту кнопку правильно прописать?

ev.metaKey
На MAC это клавиша Command, на Win - клавиша Windows.

MC-XOBAHCK 06.04.2020 07:40

Спасибо!
if ((e.code == 'KeyS' && e.ctrlKey) || (e.code == 'KeyS' && e.metaKey))

Надеюсь правильно записал.

А такой вариант записи условия не будет ошибкой:
if (e.code == 'KeyS' && ( e.ctrlKey || e.metaKey))

или здесь будет уже не та логика которая нужна?

MC-XOBAHCK 06.04.2020 07:55

Увидел отредактированное сообщение, то есть получается в условии достаточно прописать:
if (e.code == 'KeyS' && e.metaKey) {}

и работать будет для всех систем. Я правильно понял?

voraa 06.04.2020 07:57

Логика та же.
Но есть один момент. meatKey - это клавиша Win на винде.
Win+S тоже чего то там вызывает из системных приложений.
Что бы не заблокировать это придется проверять, что у нас за система Mac или Win
Обычно проверяют так

let isMac = navigator.appVersion.toUpperCase().indexOf("MAC")>-1

Но свойство appVersion обозначено, как устаревшее, а вместо него нужно использовать platform.
Думаю, не будет ошибкой написать

let isMac = navigator.platform?
navigator.platform.toUpperCase().indexOf("MAC")>-1
: navigator.appVersion.toUpperCase().indexOf("MAC")>-1

Ну а дальше

if (e.code == 'KeyS' && ( isMac && e.metaKey || e.ctrlKey))

voraa 06.04.2020 07:59

Цитата:

Сообщение от MC-XOBAHCK (Сообщение 522308)
Увидел отредактированное сообщение, то есть получается в условии достаточно прописать:
if (e.code == 'KeyS' && e.metaKey) {}

и работать будет для всех систем. Я правильно понял?

Совсем нет. На Винде это не Ctrl, а клавиша Windows (рядом с Ctrl с эмблемой Винды)

MC-XOBAHCK 06.04.2020 08:13

Цитата:

Сообщение от voraa
let isMac = navigator.platform?
navigator.platform.toUpperCase().indexOf("MAC")>-1
: navigator.appVersion.toUpperCase().indexOf("MAC")>-1


Ну а дальше

if (e.code == 'KeyS' && ( isMac && e.metaKey || e.ctrlKey))

Проверил на Windows - работает. На маке проверить нет возможности.

Спасибо большое за помощь!


Часовой пояс GMT +3, время: 09:15.