监听文本框输入

一、相关事件说明:

Firefox、Chrome、IE9,IE10 均支持 oninput 事件,此外所有版本的 IE 均支持 onpropertychange 事件。

oninput: 事件在用户输入、退格(backspace)、删除(delete)、剪切(ctrl + x)、粘贴(ctrl + v)及鼠标剪切与粘贴时触发(在 IE9 中只在输入、粘贴、鼠标粘贴时触发)。通过JS来改变value值,不会触发。

onpropertychange:事件在用户输入、退格(backspace)、删除(delete)、剪切(ctrl + x)、粘贴(ctrl + v)及鼠标剪切与粘贴时触发(在 IE9 中只在输入、粘贴、鼠标粘贴时触发)(仅 IE 支持)。通过JS来改变value值,触发。

backspace、delete: 两个按键的 keyCode 分别为 8、46。

oncut: 事件在粘贴(ctrl + v)、鼠标粘贴时触发。

var input = document.getElementById("test");
function fn() {
  // 你要执行的代码
}

if(window.addEventListener) { //先执行W3C
  input.addEventListener("input", fn, false);
} else {
  input.attachEvent("onpropertychange", fn);

}

if(window.VBArray && window.addEventListener) { //IE9
  input.attachEvent("onkeydown", function() {
    var key = window.event.keyCode;
    (key == 8 || key == 46) && fn();//处理回退与删除

  });
  input.attachEvent("oncut", fn);//处理粘贴
}

二、事件中的BUG

 描述:

  在进行输入框输入过滤时,发现了如果在IE中,元素绑定 onpropertychange事件,当元素value修改时,会导致堆栈溢出(stack overflow)。

 代码:  

$element.on(‘propertychange‘, function(){
       var val = $.trim(this.value);
       this.value = val.replace(/[^\d\.]/g, ‘‘);
 })

 原因:

  堆栈问题的出现就意味着死循环(包括递归),死循环是如何出现的呢?

  这是因为IE onpropertychange事件的触发条件是:当绑定元素的值发生任何改变,而这个改变是没有条件,只要有改动就会去触发。而上代码,由于每次输入都会改变value的,改变value的就会触发onpropertychangeg事件,从而导致事件进入触发死循环。导致stack overflow的出现。

  为什么oninput事件功能与onpropertychange功能效果一样,为什么它不会出现这个问题?

  这是因为oninput事件在元素value发生改变时,进行条件设置,当使用js来动态改变value值时,是不会触发oninput事件(propertychanger却会)。从上代码来看,如果将propertychange换成input,则每一次输入不会导致事件重复触发。因为value的是通过js来进行改变,满足oninput不触发条件。

时间: 2024-10-11 18:11:07

监听文本框输入的相关文章

监听文本框输入开发仿新浪微博限制输入字数的textarea插件

监听文本框输入 Firefox.Chrome.IE9,IE10 均支持 oninput 事件,此外所有版本的 IE 均支持 onpropertychange 事件. oninput 事件在用户输入.退格(backspace).删除(delete).剪切(ctrl + x).粘贴(ctrl + v)及鼠标剪切与粘贴时触发(在 IE9 中只在输入.粘贴.鼠标粘贴时触发). onpropertychange 事件在用户输入.退格(backspace).删除(delete).剪切(ctrl + x).粘

UISwitch的方法和监听文本框的文字改变

1.UISwitch * UISwitch继承自UIControl,因此也能像UIButton一样监听一些事件,比如状态改变事件 * UISwitch可以通过拖线监听状态改变 * UISwitch可以通过addTarget:...方法监听状态改变 - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; // 其中controlEvents参数传递的是:UICo

名称案例-使用keyup事件实现1 和 名称案例-使用watch监听文本框数据的变化2

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <script src="../vue.js"></script></head><body><div id="app"> <in

2016-1-5第一个完整APP 私人通讯录的实现 2:增加提示用户的提示框,监听文本框

一:在登录时弹出提示用户的提示框: 1.使用第三方框架. 2.在登陆按钮点击事件中增加如下代码: - (IBAction)loginBtnClicked { NSString *acount = self.acountField.text; NSString *password = self.passwordField.text; // 跳出正在登陆的提示框 [MBProgressHUD showMessage:@"正在登陆"]; // 模拟加载中 QAQ 感觉好喜感啊 dispatc

Objective - C 学习笔记:监听文本框TextField的文字改变

* 一个文本输入框的文字发生改变时,文本输入框会发出一个UITextFieldTextDidChangeNotification通知 * 因此通过监听通知来监听文本输入框的文字改变 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:textField]; // textField

动态实时监听文本框中内容的变化

@property (strong, nonatomic) UITextField *iPhoneText; @property (strong, nonatomic) UITextField *passwordText; @property (strong, nonatomic) UIButton *passwordBtn; viewdidLoad 中设置文本框的监听变化的方法 [self.iPhoneText addTarget:self action:@selector(textChang

完美解决监听文本框改变事件

$('input').bind('input propertychange', function() {  //进行相关操作 });

文本框输入内容智能提示效果

实现效果如图 大体思路: 1.监听文本框事件.这里是用的keyup事件.大家可以尝试用onchange事件.不过感觉keyup事件的效果要好一点. 2.根据输入内容通过ajax异步的方式去访问后台数据. 3.遍历返回数据将数据添加到显示区域. 4.在添加数据的同时给每一条数据加上一些效果,点击其中一条将数据填到文本框,并且提示内容消失. 5.后台数据应该拼接成json格式.我这里的格式是这样的[{"name":"张三","sex","男

转:zTree树控件扩展篇:巧用zTree控件实现文本框输入关键词自动模糊查找zTree树节点实现模糊匹配下拉选择效果

是否可以借助于zTree实现文本框输入关键词自动模糊匹配zTree下拉树,然后选择下拉树内节点显示在文本框内且隐藏下拉树. 看到这个需求脑子里头大致已经想到了要如何实现这样一个需求,当时是限于时间问题所以没有动手处理.今天闲来无事琢磨了一下这个需求.我的解决思路如下所示: 1.监听文本框的onkeyup事件:实时传递其值到某个函数: 2.编写某个函数接收文本框的值通过zTree的模糊查找方法getNodesByParamFuzzy(key,value)获得: 3.将匹配到的节点列表结合重新赋值给