8

如果除 2 个特定输入字段以外的任何内容都专注于使用 jquery,我如何禁用退格键击?

这是我当前的代码(现在包括 2 个文本框):

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

虽然这不起作用....有什么想法吗?

4

9 回答 9

12

我认为这可以解决问题:

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

假设文本框具有“textInput”类。

这是一个工作示例

于 2010-04-15T14:11:29.427 回答
8

这将在您的站点上禁用退格,而无需将特定类添加到输入框。要禁用退格,除非使用输入框,请使用.is("input:focus")如果要禁用退格,除非使用文本区域框,请使用.is("input:focus, textarea:focus")

$(document).keypress(function(e){ 
    var elid = $(document.activeElement).is("input:focus"); 
    if(e.keyCode === 8 && !elid){ 
       return false; 
    }; 
});
于 2011-11-22T12:29:24.833 回答
6

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 的评论中提到的,当按下退格键时,有更多的输入类型可能会让您返回。请在 is() 方法的逗号分隔选择器列表中添加任何类型的允许直接字符输入并且在您的 HTML 代码中真正使用的输入字段,例如input[type="password"]:focusinput[type="number"]:focusinput[type="email"]:focus

于 2012-11-13T10:36:05.260 回答
5

我认为处理文本区域需要稍作修改:

var elid = $(document.activeElement).is("input:focus, textarea:focus"); 
于 2012-05-23T09:47:48.640 回答
4

我对接受的答案做了些许改动,这可能对某人有用:

$(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;
        }
    }
});

使用这种方法,用户仍然可以通过按住 CTRL 使用 Backspace 进行导航,但它也考虑到textarea任何input.

当然,另一种选择是使用类似这样的东西,如果用户输入任何内容,它就不允许用户离开页面。

于 2013-06-24T14:58:33.153 回答
2

Hudson-Peralta 的回答对我来说很有效,但我做了一个小的修改,因为我使用了许多 keydown 事件:

$(document).keydown(function(e){ 
            var elid = $(document.activeElement).is("input:focus"); 
            if(e.keyCode === 8 && !elid){ 
               e.preventDefault(); 
            }; 
        });
于 2012-02-17T21:38:25.527 回答
2

@Nick Craver,出于几个原因的可耻回答。回答这个问题,或者至少深思熟虑地光顾。

这是一个基于原型的解决方案,我最终将其用于我的表单,因为用户抱怨退格键会将它们从表单中带走(这显然是违反直觉的事情,有人想知道为什么所有浏览器都使用退格键作为后退按钮)。




        // 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();
               }
             }
          });
        });

于 2011-11-04T16:46:26.060 回答
0

我也为此努力过。最后,我找到了答案,为了方便大家,我将解决方案放在http://blog.totusinfo.com/jquery-disable-backspace-for-document-history-except-inputs-and-textarea/

于 2012-10-17T08:24:59.420 回答
0

我稍微修改了答案以结合每个人的好答案
1.使用选择器“input [type = text]:focus,textarea:focus”来维护这些元素的默认行为,并且正如JPsy所说,以防止输入的默认行为像复选框
2. 使用 e.target 代替使代码更完全依赖于 JQuery,因为我不确定每个浏览器是否都支持 document.activeElement

编辑
3.还通过添加"input[type=password]:focus"来包含密码字段,

     $(文档).keydown(函数(e){

          var code=e.keyCode;
          var is_to_stop= (!$(e.target).is("input[type=text]:focus, input[type=password]:focus, textarea:focus")) && (code==8);
          如果(is_to_stop){
            返回假;
          }

    });

于 2013-01-29T08:13:08.793 回答