解决其他浏览器没有propertychange事件
监听实现:
/** * 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"); }