• 解决其他浏览器没有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(/msies*([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");
    }
    
  • 相关阅读:
    手写Linq To Object
    4、IOC--内置Unity容器的使用
    WebApi 基于JWT实现Token签名认证
    软件架构师之路--观察者模式
    EF--封装三层架构IOC
    EF--主外键关系导航属性
    EF--EntityState相互转换
    证明task线程是来源于线程池的,线程重用
    3、IOC--手写Unity容器--链式依赖--第N层依赖注入
    2、IOC--手写Unity容器--第一层依赖注入
  • 原文地址:https://www.cnblogs.com/JsonShare/p/4329698.html
Copyright © 2020-2023  润新知