监听input框变化,即时搜索 compositionstart, compositionend
前话: 如果直接通过input监听, 它是键盘输入按键按下了就触发时间,这样可能导致一些问题,比如在谷歌浏览器想输入中文输入不了;
解决方案: 用 compositionstart 和 compositionend, 这个 会在选定文字后才出发 input 事件;
注意: 因为谷歌浏览器跟其他浏览器的执行顺序不同, 谷歌是 compositionstart => 监听input事件 => compositionend, 其他浏览器是 compositionstart => compositionend => 监听input事件,
所以 要在 compositionend 里面判断是否是谷歌浏览器,做浏览器的兼容输入;
另外还有一个坑, 就是 即时搜索input监听 ajax 请求接口的时候,不同做同步 async: false, 必须异步, 不然浏览器直接卡死崩溃,这个在本地测试不会出问题,到线上就出现!!!
var flag = false; // true 正在输入
// 这里 input是自己input元素,比如id #id这种
$('body').on('compositionstart', ' .search_code .layui-select-title input', function(){
flag = true;
});
$('body').on('compositionend', '.search_code .layui-select-title input', function(){
flag = false;
// 判断是否是谷歌浏览器
if(!flag && isChrome()){
changeEvent(this)
}
});
// 监听input事件
$('body').on('input change', '.search_code .layui-select-title input', function(){
changeEvent(this)
})
function changeEvent(_this){
if(!flag){
// 输入的值
var val = $.trim($(_this).val());
$.ajax({
url: '接口url',
type: 'post',
dataType: 'json',
contentType:'application/json; charset=utf-8',
// async: false, // 不能是同步
data: params,
success: function (res) {
console.log(res);
var data = res.data;
if (res) {
var html = '';
if (res.code != 0) {
html += '<option value="" >请输入食品编码或名称来搜索</option>';
} else {
for(var i=0; i<data.length; i++){
html += '<option value="'+ data[i].code +'">';
html += data[i].code + ' '+ data[i].name + '</option>';
}
}
$('select[name=food_code]').html(html);
// 保持聚焦, 不然输入后就没光标了
$('.search_code .layui-select-title input').focus();
// 重新赋值上去,不同写法自己要做改变
$('.search_code .layui-select-title input').val(val);
}
}
});
}
}
/**
* 判断是否是谷歌
*/
function isChrome(){
var browser = {
versions: function() {
var u = navigator.userAgent, app = navigator.appVersion;
return {
trident: u.indexOf('Trident') > -1, //IE内核
presto: u.indexOf('Presto') > -1, //opera内核
webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), //是否为移动终端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器
iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者QQHD浏览器
iPad: u.indexOf('iPad') > -1, //是否iPad
webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部
};
}(),
language: (navigator.browserLanguage || navigator.language).toLowerCase()
}
if(browser.versions.webKit){
return true;
}
return false;
}
监听input框变化,即时搜索 compositionstart, compositionend的更多相关文章
- onchange监听input值变化及input隐藏后change事件不触发的原因与解决方法(设置readonly后onchange不起作用的解决方案)
转自:https://www.cnblogs.com/white0710/p/7338456.html 1. onchange事件监听input值变化的使用方法: <input id=" ...
- 监听INPUT值的即时变化
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 通过定时监听input框来实现onkeyup事件-
问题:因为zepto无法使用onkeyup 事件 解决方法:通过给input框绑定focus 事件,定时的去监听input的值得改变,在鼠标移出input后,清除定时器 <!DOCTYPE ht ...
- angular4 监听input框输入值的改变
angular中一般控件会有change事件,但是如果某些控件没有这个事件 我们如何监听值的变化呢? 对于双向绑定的值,当值改变后监听事件有如下写法: 1. 如果是ngModel可以用ngModelC ...
- JS监听input框的回车事件、属性值改变事件
一.介绍 在程序猿门的工作中,经常会遇见一些表单数据的提交,对于有表单的东西而言,input输入框是非常常见的,所以对于一些input的基本事件,我们需要去掌握 二.input的监听enter事件 比 ...
- juery中监听input的变化事件
$('#searchValue').bind('input propertychange', function() { searchFundList(); });
- js监听文本框变化事件
用js有两种写法: 法一: <!DOCTYPE HTMl> <html> <head> <title> new document </title& ...
- 利用原生JS实时监听input框输入值
传送门https://www.cnblogs.com/lantinggumo/p/7636715.html 传送门https://www.cnblogs.com/nailc/p/8572226.htm ...
- js监听input等表单输入框的变化事件oninput
js监听input等表单输入框的变化事件oninput,手机页面开发中使用到文本框textarea输入字符监听文本框变化计算还可以输入多少字符,如果使用onkeyup的话是无法监听到输入法输入的文本变 ...
随机推荐
- php中的print函数
php print函数怎么用? 定义和用法 print() 函数输出一个或多个字符串. 注释:print() 函数实际不是一个函数,所以您不必对它使用括号. 提示:print() 函数比 echo() ...
- mysql常用的索引种类
一.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度 二.索引类型 Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RT ...
- 020_C语言常用函数
1. 清除数组,初始化数值 头文件:#include <memory.h>或 #include <string.h>函数原型:memset(void *s,int ch,siz ...
- SPOJ GSS1 - Can you answer these queries I(线段树维护GSS)
Can you answer these queries I SPOJ - GSS1 You are given a sequence A[1], A[2], -, A[N] . ( |A[i]| ≤ ...
- windows游戏编程 绘图基础
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22451353 作者:jadeshu 邮箱: jades ...
- Java并发概念-2
一,死锁: 所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在 ...
- yum install 报错
把python2升级到python3以后,yum报错: [root@localhost Python-]# yum install openssl File except KeyboardInterr ...
- Linux设备驱动程序 之 per-cpu变量
数组形式 支持SMP的现代操作系统使用每个cpu上的数据,对于给定的处理器其数据是唯一的:一般来说,每个cpu的数据存放在一个数组中,数组总的每一项对应着系统上的一个存在的处理器:按当前处理器号确定这 ...
- GetProp和SetProp的区别
GetProp 函数功能:该函数从给定窗口的属性列表中检索数据句柄.给定的字符串标识了要检索的句柄.该字符串和句柄必须在前一次调用SetProp函数时已经加到属性表中. 函数原型:HANDLE Get ...
- Android 显示系统:OpenGL简介和Gralloc代码分析
一.OpenGL ES与EGL Android的GUI系统是基于OpenGL/EGL来实现的. 由于OpenGL是通用函数库,在不同平台系统上需要被“本土化”——把它与具体平台的窗口系统建立起关联,F ...