监听实现:

/**
* Listener.js
* 此类用于解决非ie下,通过js改变input的值时,
* 无法触发其事件的问题(如:onpropertychange, oninput, onchange)
*/
function Listener() {
//定时器
var interval_l = null;
//key:name,value:value. 用于判断元素value是否变更
var objValMap = new Map();
//定时扫描的元素集
var targetObjects = null;
//检查当前浏览器是否是ie
var isIe = function () {
return jQuery.browser.msie;
}; //检查当前监听器中是否有绑定监听对象
var isEmpty = function () {
if (targetObjects == null || targetObjects.length == 0) {
return true;
}
return false;
}; //定时执行的内容
var execute = function (exeattr) {
if (isIe() && !isEmpty()) {
return;
}
if(isEmpty()){return;}
//迭代元素集合
jQuery.each(targetObjects, function (i, n) {
var oldVal = objValMap.get(n.name);
var _element = jQuery("input[name=" + n.name + "]")[0];
var newVal = _element.value;
if (oldVal != newVal) {
objValMap.put(n.name, n.value);
var _callbak = jQuery(_element).attr(exeattr);
try {
eval(_callbak);
} catch(e) {}
}
});
};
//开始执行
var start = function (seed, exeattr) {
if (isIe() && !isEmpty()) {
return;
}
if (seed == undefined || seed == 0) {
seed = 500;
}
if (exeattr == undefined) {
exeattr = "_listener";
}
interval_l = window.setInterval(function () {execute(exeattr);}, seed);
}
//停止监听器
var stop = function () {
if (interval_l) {
window.clearInterval(interval_l);
}
};
//绑定监听对象
var load = function (selector) { if (isIe()) {
return;
}
if (selector == undefined) {
selector = "input[type=hidden][_listener!='']";
}
targetObjects = jQuery(selector);
jQuery.each(targetObjects, function (i, n) {
objValMap.put(n.name, n.value);
});
};
this.execute = execute;
this.start = start;
this.stop = stop;
this.load = load;
} /**
* 键值对,同Java Map
*/
function Map () {
var struct = function(key, value) {
this.key = key;
this.value = value;
}
var put = function(key, value){
for (var i = 0; i < this.arr.length; i++) {
if ( this.arr[i].key === key ) {
this.arr[i].value = value;
return;
}
}
this.arr[this.arr.length] = new struct(key, value);
} var get = function(key) {
for (var i = 0; i < this.arr.length; i++) {
if ( this.arr[i].key === key ) {
return this.arr[i].value;
}
}
return null;
} var remove = function(key) {
var v;
for (var i = 0; i < this.arr.length; i++) {
v = this.arr.pop();
if ( v.key === key ) {
continue;
}
this.arr.unshift(v);
}
} var size = function() {
return this.arr.length;
} var isEmpty = function() {
return this.arr.length <= 0;
} this.arr = new Array();
this.get = get;
this.put = put;
this.remove = remove;
this.size = size;
this.isEmpty = isEmpty;
};

调用实例:

jQuery(document).ready(function(){
var ua=navigator.userAgent.toLowerCase();
var s=null;
var browser={
msie:(s=ua.match(/msie\s*([\d\.]+)/))?s[1]:false,
firefox:(s=ua.match(/firefox\/([\d\.]+)/))?s[1]:false,
chrome:(s=ua.match(/chrome\/([\d\.]+)/))?s[1]:false,
opera:(s=ua.match(/opera.([\d\.]+)/))?s[1]:false,
safari:(s=ua.match(/varsion\/([\d\.]+).*safari/))?s[1]:false
}; if(browser.msie){
jQuery("#field8304").bind("propertychange", getUp);
}else{
jQuery("#field8304").attr("_listener","getUp();");
} var l = new Listener();
l.load("input[type=hidden][_listener!='']"); //不传参数时,默认参数为:"input[type=hidden][_listener!='']";
l.start(500, "_listener"); //不传参数时,默认参数为:500, "_listener" });
function getUp(){
alert("change");
}

解决其他浏览器没有propertychange事件的更多相关文章

  1. propertychange事件导致的IE浏览器堆栈溢出

    前段事件做项目,在IE下测试时,发现会报堆栈溢出的错误,其他浏览器正常,于是开始了苦逼的IE查错路程... 由于是在操作了某个输入框之后才出现的错误,所以把重点放到了input的相关事件,最终发现是这 ...

  2. 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新

    在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...

  3. JavaScript 浏览器中的事件

    1.事件的基本概念 事件是指在文档或者浏览器中发生的一些特定交互瞬间,比如打开某一个网页,浏览器加载完成后会触发 load 事件,当鼠标悬浮于某一个元素上时会触发 hover 事件,当鼠标点击某一个元 ...

  4. 解决内部元素onMouseOver/onMouseOut事件冒泡触发父元素的相应事件

    前阵子为BS项目模板做了一个左侧滑动信息栏,效果类似于windows状态栏的自动隐藏效果,鼠标移进滑出,鼠标移出隐藏,浮动时不占用空间,也可以固定住占一块位置.做的过程中遇到一个问题,鼠标在信息栏内部 ...

  5. 如何阻止浏览器的默认事件,你是否也遇到过无法阻止Google默认事件的情况( 原生JS )

    如题,话不多话,我们先看怎么解决 根据不同的绑定事件的方法,我们有不同的阻止默认事件的方法 如果你不知到如何绑定事件,请查看我的上一篇文章 关于浏览器滚动的兼容性问题以及事件绑定 1.句柄绑定 只需要 ...

  6. 10、网页制作Dreamweaver(扩展:各浏览器对 onunload 事件的支持与触发条件实现有差异)

    标准参考 在 HTML 4.01 规范中关于 onunload 事件的描述是:当 document 从 window 中移除时,触发 onunload 事件. 关于 HTML 4.01 规范中 onu ...

  7. 各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异

    转载:http://www.w3help.org/zh-cn/causes/BX2047 标准参考 无. 问题描述 一般情况下,onbeforeunload 事件处理函数内会写入一些提示性语句,当用户 ...

  8. 解决chrome浏览器在win8下没有注册类的问题

    解决chrome浏览器在win8下没有注册类的问题 新建一个txt,里面存放代码 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SO ...

  9. 解决IE浏览器缓存导致AJAX请求数据异常

    IE10浏览器会把AJAX请求的数据都缓存下来,然后每次想去刷新数据时发现数据都是一样的,于是导致数据显示异常. 解决方法: 在页面<head>标签里,加上以下声明: <!-- 解决 ...

随机推荐

  1. python——模块

    一.导入模块 Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入.导入模块有一下几种方法: 1 import module 2 fr ...

  2. 老司机带你开飞机 一: mssql on linux 安装指导

    通常在本机开发环境中需要搭建所有的服务,还要修改本地的hosts,实在是不胜其烦.如今有了docker,完全不用污染本地环境,且看老司机带你搭建一个asp.net core的开发环境集群.愿你走出虚拟 ...

  3. 运行出错之未能加载文件或程序集“Microsoft.ReportViewer.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91”或它的某一个依赖项。系统找不到指定的文件。文件名:“Microsoft.ReportViewer.Common, Version=11.0.0.0,

    这个问题是因为在项目中缺少Microsoft.ReportViewer.Common程序集. 方法一:缺少哪些文件或程序集,到程序开发计算机下找到对应的烤到客户端的程序启动目录下即可(项目烤到Bin\ ...

  4. [原创] 绿色单文件封装程序GreenOne V3.0

    1.原理 将包含可执行文件的多个文件 调用Winrar,创建自解压格式压缩文件 设置高级自解压选项中的文本和图标,设置解压后运行的文件为选中的可执行文件. 这种创建单文件封装其实也就是一个Winrar ...

  5. 在Debian 8 上安装自动化工具Ansible

    如果你是新手,就不要犹豫了,ansible是你最好的选择,本人菜鸟一个.废话少说,开始安装! 实验环境: 192.168.3.190 192.168.3.191 192.168.3.192 192.1 ...

  6. IOS的自定义控件

    这里做一个类似于下面界面的小案例 1.创建一个空的布局文件 .xib new File -->User Interface -->选择View 创建一个空的view ,会自动生成一个 .x ...

  7. JS中作用域

    var scope = 'global'; var f = function() { console.log(scope); // 输出 undefined var scope = 'f'; } f( ...

  8. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

  9. 配置nginx脚本开机自启动

    vi /etc/init.d/nginx 插入以下内容,修改红色字体自己安装路径 #!/bin/bash## chkconfig: - 85 15# description: Nginx is a W ...

  10. 【2017-05-18】WebForm的Repeater控件和一些简单控件

    一.Repeater控件 1. <%@ %> - 这里面写一些声明和引用的 <%  %> - 编写C#代码的 <%= %> - 往界面上输出一个变量的值 <% ...