Отключить возврат с помощью прослушивателей DOM Level 3

Я делаю страницу, на которой пользователь должен иметь возможность печатать. Функция возврата по умолчанию - вернуться на страницу назад, однако мне нужно предотвратить это и назначить ей свою собственную функцию.

Проблема на самом деле в предотвращении возврата. Я могу захватить это, однако я не могу предотвратить это. Я использую прослушиватели 3-го уровня. Функция event.preventDefault() не работает для меня и не возвращает false.

Я пробовал это также:

function onunload(e) {
    if (e.keyCode == 37) return false;
    return true;
}

а также

<body onunload="return false;">

Однако первый в основном делает

return confirm("false");

а второй ничего не делает?

3 ответа

Решение

Полное предотвращение нажатия клавиши Backspace может быть плохой идеей, предположим, что вы сделали опечатку и хотите исправить ее в текстовом поле! Так что вам нужно отключить клавишу Backspace, только если кто-то не вводит текстовый ввод!

Это может работать во всех основных браузерах:

document.onkeydown = function (e) {
    e = e || window.event;
    if (e.keyCode == 8) {                                           // Disable Backspace
        var el = document.activeElement;
        if (!((el.nodeName == "INPUT" && (el.type == "text" || el.type == "password")) || el.nodeName == "TEXTAREA")) {
            e.preventDefault();
            e.stopPropagation();
            return false;
        }
    }
};

Спецификация модели событий DOM3 имеет обратную совместимость, поэтому я не думаю, что это может быть проблемой, однако это модифицированная версия DOM3 приведенного выше кода:

function KeyDownHandler(e) {
    if (e.keyCode == 8) {                                           // Disable Backspace
        var el = document.activeElement;
        if (!((el.nodeName == "INPUT" && (el.type == "text" || el.type == "password")) || el.nodeName == "TEXTAREA")) {
            e.preventDefault();
            e.stopPropagation();
        }
    }
};

if (document.attachEvent) document.attachEvent("onkeydown", KeyDownHandler);
else document.addEventListener("keydown", KeyDownHandler);

Регистрация событий DOM3, подобная описанной выше, может быть очень сложной, у Джона Ресига есть хорошая реализация, однако вы можете использовать стандартную кросс-браузерную библиотеку, такую ​​как JQuery, которая прекрасно работает во всех основных браузерах!

Использовать keydown обработчик на document уровень:

document.onkeydown = function(e){
 if (e.keyCode===8) {
   return false;
 }
};

AFAIR, можно запретить действия ярлыков браузера по умолчанию, вернув false в keypress только в Firefox (и последняя версия, которую я тестировал, была 3.x).

beforeunload а также unload являются конкретными событиями, и строка должна быть возвращена в их обработчиках. Из соображений безопасности браузер может отображать только диалоговое окно подтверждения с предоставленным сообщением (эта строка). Более того, Firefox начиная с версии 4 даже игнорирует эту строку и всегда отображает стандартное сообщение.

Там нет никакого способа, чтобы молча запретить пользователю покинуть страницу.

Кстати, backspace не работает как history.back() в Ubuntu.

Другие вопросы по тегам