Как отключить возврат, если что-то кроме поля ввода ориентировано на использование jquery - PullRequest
8 голосов
/ 15 апреля 2010

Как отключить нажатие клавиши Backspace, если что-то, кроме 2 определенных полей ввода, сосредоточено на использовании jquery?

вот мой текущий код (СЕЙЧАС ВКЛЮЧАЯ 2 ТЕКСТБОКСА):

$(document).keypress(function(e){
  var elid = $(document.activeElement).attr('id');
  if(e.keyCode === 8 && elid != 'textbox1' || elid != 'textbox2'){
      return false;
  };
});

это не работает, хотя .... есть идеи?

Ответы [ 9 ]

12 голосов
/ 15 апреля 2010

Я думаю, что это поможет:

$(document).keydown(function(e) {
    var elid = $(document.activeElement).hasClass('textInput');
    if (e.keyCode === 8 && !elid) {
        return false;
    };
});

при условии, что у текстовых полей есть класс 'textInput'.

Вот рабочий пример

8 голосов
/ 22 ноября 2011

Это отключит возврат на вашем сайте без необходимости добавлять определенные классы в поля ввода. Чтобы отключить возврат, кроме случаев использования полей ввода, используйте .is («input: focus») , если вы хотите отключить возврат, кроме случаев использования полей textarea, используйте .is («input: focus, textarea: focus» «)

$(document).keypress(function(e){ 
    var elid = $(document.activeElement).is("input:focus"); 
    if(e.keyCode === 8 && !elid){ 
       return false; 
    }; 
});
6 голосов
/ 13 ноября 2012

Решение Hudson-Peralta + QF_Developer великолепно, но имеет один недостаток:
Если вы сфокусировались на переключателе или флажке, кнопка возврата будет по-прежнему отбрасывать вас назад со страницы. Вот модификация, чтобы избежать этого разрыва:

$(document).keydown(function(e){ 
  var elid = $(document.activeElement).is('input[type="text"]:focus, textarea:focus'); 
    if(e.keyCode === 8 && !elid){ 
      return false; 
    }; 
});

РЕДАКТИРОВАТЬ 20130204:
keypress() заменено на keydown()!
Код выше теперь работает правильно.

РЕДАКТИРОВАТЬ 20151208:
Как уже упоминалось в комментарии @outofmind, есть и другие типы ввода, которые могут отбросить вас назад при нажатии клавиши Backspace. Добавьте в список селекторов через запятую метода is () любой тип полей ввода, которые допускают прямой ввод символов и которые действительно используются в вашем HTML-коде, например input[type="password"]:focus, input[type="number"]:focus или input[type="email"]:focus.

5 голосов
/ 23 мая 2012

Я думаю, что для обработки текстовых полей необходима небольшая модификация:

var elid = $(document.activeElement).is("input:focus, textarea:focus"); 
4 голосов
/ 24 июня 2013

Я внес небольшое изменение в принятый ответ, который может быть кому-то полезен:

$(document).keydown(function(e) {
    var elid = $(document.activeElement).is("input, textarea") ;
    if (e.keyCode === 8 && !elid) {
        if(e.ctrlKey) {
            window.history.back()
        }
        else {
            alert("Navigating with Backspace has been disabled. Use CTRL + Backspace if you want to go back to the previous page (and lose any unsaved changes).");
            return false;
        }
    }
});

С помощью этого метода пользователь все еще может перемещаться с помощью Backspace, удерживая клавишу CTRL, но он также учитывает textarea, а также любые input.

Конечно, альтернатива состоит в том, чтобы использовать что-то вроде this , что не позволяет пользователю покинуть страницу, если он что-то ввел.

2 голосов
/ 18 февраля 2012

Ответ Хадсон-Перальты сработал хорошо для меня, но я сделал небольшую модификацию, так как использую много событий нажатия клавиш:

$(document).keydown(function(e){ 
            var elid = $(document.activeElement).is("input:focus"); 
            if(e.keyCode === 8 && !elid){ 
               e.preventDefault(); 
            }; 
        });
2 голосов
/ 04 ноября 2011

@ Ник Крейвер, позорный ответ по нескольким причинам. Ответь на вопрос или хотя бы задумайся.

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




        // event handlers must be attached after the DOM is completely loaded
        Event.observe(window, 'load', function() {
          // keypress won't fire for backspace so we observe 'keydown'
          Event.observe(window, 'keydown', function(event){
            // 8 == backspace
            if( event.keyCode == 8) {
                // with no field focused, the target will be HTMLBodyElement
               if( event.target == document.body) {
                  // stop this event from propagating further which prevents                      
                  // the browser from doing the 'back' action
                  event.stop();
               }
             }
          });
        });

0 голосов
/ 29 января 2013

Я немного изменил ответ, чтобы объединить хороший ответ каждого
1. использовал селектор «input [type = text]: focus, textarea: focus» для поддержания поведения по умолчанию для этих элементов и, как сказал JPsy, для предотвращения поведения по умолчанию на входах, таких как флажок
2. вместо этого использовал e.target, чтобы сделать код более зависимым исключительно от JQuery, так как я не уверен, что каждый браузер хорошо поддерживает document.activeElement

EDIT
3. Включите также поле пароль , добавив "input [type = password]: focus" ,

     $(document).keydown(function(e){

          var code=e.keyCode;
          var is_to_stop= (!$(e.target).is("input[type=text]:focus, input[type=password]:focus, textarea:focus")) && (code==8);
          if(is_to_stop){
            return false;
          }

    });

0 голосов
/ 17 октября 2012

Я тоже много работал над тем же. Наконец, я нашел ответ, и для удобства я поместил решение на http://blog.totusinfo.com/jquery-disable-backspace-for-document-history-except-inputs-and-textarea/

...