前话: 如果直接通过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的更多相关文章

  1. onchange监听input值变化及input隐藏后change事件不触发的原因与解决方法(设置readonly后onchange不起作用的解决方案)

    转自:https://www.cnblogs.com/white0710/p/7338456.html 1. onchange事件监听input值变化的使用方法: <input id=" ...

  2. 监听INPUT值的即时变化

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 通过定时监听input框来实现onkeyup事件-

    问题:因为zepto无法使用onkeyup 事件 解决方法:通过给input框绑定focus 事件,定时的去监听input的值得改变,在鼠标移出input后,清除定时器 <!DOCTYPE ht ...

  4. angular4 监听input框输入值的改变

    angular中一般控件会有change事件,但是如果某些控件没有这个事件 我们如何监听值的变化呢? 对于双向绑定的值,当值改变后监听事件有如下写法: 1. 如果是ngModel可以用ngModelC ...

  5. JS监听input框的回车事件、属性值改变事件

    一.介绍 在程序猿门的工作中,经常会遇见一些表单数据的提交,对于有表单的东西而言,input输入框是非常常见的,所以对于一些input的基本事件,我们需要去掌握 二.input的监听enter事件 比 ...

  6. juery中监听input的变化事件

    $('#searchValue').bind('input propertychange', function() { searchFundList(); });

  7. js监听文本框变化事件

    用js有两种写法: 法一: <!DOCTYPE HTMl> <html> <head> <title> new document </title& ...

  8. 利用原生JS实时监听input框输入值

    传送门https://www.cnblogs.com/lantinggumo/p/7636715.html 传送门https://www.cnblogs.com/nailc/p/8572226.htm ...

  9. js监听input等表单输入框的变化事件oninput

    js监听input等表单输入框的变化事件oninput,手机页面开发中使用到文本框textarea输入字符监听文本框变化计算还可以输入多少字符,如果使用onkeyup的话是无法监听到输入法输入的文本变 ...

随机推荐

  1. Longest Common Subsequence (DP)

    Given two strings, find the longest common subsequence (LCS). Your code should return the length of  ...

  2. js原生ajax与jquery的ajax的用法区别

    什么是ajax和原理? AJAX 是一种用于创建快速动态网页的技术. 通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据 XMLHttpRequest对象的基本属性: onre ...

  3. Windows服务启动时候报错1053

    用.net 开发了一个C#语言的windows服务,在本地和测试环境,安装启动都正常,在新的线上环境报错,不能启动-报出-错误1053:服务没有及时响应启动或控制请求. 后来发现时线上.NET FRA ...

  4. 题解 [NOIP2015]运输计划

    题解 [NOIP2015]运输计划 题面 解析 首先肯定是要求出每条路径的长度. 这个用节点到根的前缀和就行了(一开始脑抽写了个线段树...) 然后有一个显然的类似贪心的想法, 就是你改造的边肯定在最 ...

  5. Python 8--异常

  6. form表单 一个input时 回车自动提交

    问题描述 form表单中,如果当前表单只有一个input输入框时,单击回车会自动提交当前表单. 解决方案 在当前form表单中添加一个隐藏的input, <input style="d ...

  7. learning express step(十二)

    learning express view engine function const express = require('express'); const app = express(); app ...

  8. adb命令积累

    1. 模拟事件全部是通过input命令来实现的,首先看一下input命令的使用: (原文:http://blog.csdn.net/huiguixian/article/details/1192538 ...

  9. AI 期刊会议

    本文目的为寻找以下方向最新的发展方向和资料,比如期刊会议. AI包括以下方向:计算机视觉(CV).语言(NLP)和语音 A:计算机视觉(CV) B:语言(NLP) 1. 会议 ACL.EMNLP.NA ...

  10. 第二章实战补充:Python操作Mysql

    ( 一) 导入pymysql 基础铺垫:pymysql与MySQLdb pymysql–支持py2.py3; MySQLdb–仅支持python3; django内部默认为MySQLdb,用Pytho ...