2010-04-15 28 views
8

如何禁用退格键击如果除了2特定的输入字段之外的任何事情都集中在使用jQuery?如何禁用退格如果输入字段以外的任何事情都集中在使用jQuery

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

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

这是行不通的,虽然....任何想法?

回答

12

我认为这会做的伎俩:

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

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

Here is a working example

+0

事件不会在此退火 – 2012-12-20 11:51:33

+1

您说得对,'keypress'不会在退格时触发。 Iv'e更新为'keydown',现在它可以工作。感谢您的评论 – 2012-12-20 12:22:20

+0

伟大的,这个工程。我已经将条件检查改为$(document.activeElement).is(“input [type = text]”),因为我没有使用这样的类。如果需要可以添加其他类型。 – 2012-12-20 12:45:33

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

+0

看起来很棒,但没有在Chrome上运行,因为它没有Event.observe。我也坚持它在$(document).ready(function(){...卡在这里...)中,因为你说“在DOM完全加载后必须附加”。 – Volomike 2015-11-09 16:08:23

+0

@Volomike对不起,我应该做更清楚的是这是一个基于原型javascript框架(http://prototypejs.org/)的解决方案,它与jquery类似,只是更糟糕。 – Wulf 2015-12-02 13:05:28

8

这将禁用您网站上的退格,而不必将特定的类添加到输入框。要使用输入框中使用。是(“输入:焦点”)时,除了禁用退格键如果要禁用在使用textarea的框中使用。就是除了退格(“输入:焦点textarea的:聚焦”)

$(document).keypress(function(e){ 
    var elid = $(document.activeElement).is("input:focus"); 
    if(e.keyCode === 8 && !elid){ 
     return false; 
    }; 
}); 
+1

输入和textarea都应该支持退格 – 2012-06-25 15:07:11

+0

非常好的例子,谢谢:D – Zombyii 2015-06-15 09:27:17

+0

如果它已经是活动元素,为什么还要检查:focus事件? – Volomike 2015-11-09 16:21:08

2

哈德森 - 佩拉尔塔的回答工作对我好,但我做了一个小的修改,因为我用很多的keydown事件:

$(document).keydown(function(e){ 
      var elid = $(document.activeElement).is("input:focus"); 
      if(e.keyCode === 8 && !elid){ 
       e.preventDefault(); 
      }; 
     }); 
+0

不支持TEXTAREA – Volomike 2015-11-09 16:18:49

5

我认为需要稍加修改来处理文字区域:

var elid = $(document.activeElement).is("input:focus, textarea:focus"); 
6

哈德森 - 佩拉尔塔+ 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:取代keydown()
keypress()
上面的代码现在可以正常工作。

编辑20151208:
正如在本评论中提及@outofmind有按退格键时可以扔你回来更多的输入类型。请在is()方法的逗号分隔选择器列表中添加任何类型的允许直接字符输入的输入字段,这些输入字段实际上在您的HTML代码中使用,如input[type="password"]:focusinput[type="number"]:focusinput[type="email"]:focus

+1

我必须将**按键**更改为** keydown **才能使其工作 – 2013-02-03 19:39:14

+0

您是完全正确的,托马斯!我已经更正了我的答案,在我自己使用代码的项目中,我也使用keydown,但为了保持与这里的讨论一致,我复制并修改了此讨论中的现有块d介绍了错误。抱歉。 – Jpsy 2013-02-04 08:28:56

+2

用于更新答案的+1;) – 2013-02-04 21:59:33

0

我修改的答案多一点大家的很好的答案结合
1.使用选择“输入[类型=文本]:焦点,文本区域:重点”,以保持这些元素的默认行为,并作为JPsy说,防止默认行为像复选框
2.使用e.target反而使代码更完全取决于JQuery的投入,因为我不知道,如果每一个浏览器的支持以及document.activeElement

编辑
3.包含密码场也通过添加“输入[类型=密码]:聚焦”

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

    }); 

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

当然,替代方案是使用类似this的东西,而不允许用户在输入任何内容时离开页面。

+1

这应该是最好的答案,因为它是最完整的。谢谢你 - 我今天在Qt/C++应用程序中使用了QWebView小部件。 – Volomike 2015-11-09 16:15:23

相关问题