// JS钩子示例 // JS对于不同消息类型,实现了不同的调用链 // 事件触发的时候,根据消息类型,调用对应的调用链 // 同一个钩子函数,安装多次,会根据安装顺序,调用多次 // 可以对比Windows API的钩子如SetWindowsHookEx等,原理上很相似 // 储存全部事件的调用链函数列表 function hooks() { this.queue = new Array(); } // 通过addAction,生成调用链 hooks.prototype.addAction = function (hook, func) { // 某一个事件的调用链函数列表 if(this.queue[hook]==undefined){ this.queue[hook] = new Array(); } if (typeof func == 'function') { this.queue[hook].push(func); } else if (typeof func == 'string') { this.queue[hook].push(this.window[func]); } } // 通过doAction,实现调用链 hooks.prototype.doAction = function (hook) { var parameters = Array.prototype.slice.call(arguments, 1); var functions = this.queue[hook]; for (var i = 0; i < functions.length; i++) { this.call_user_func_array(functions[i], parameters); } return true; } // 实现具体钩子函数调用 hooks.prototype.call_user_func_array = function(cb, parameters) { if (typeof cb === 'string') { func = (typeof this[cb] === 'function') ? this[cb] : func = (newFunction(null, 'return ' + cb))(); } else if (cb instanceof Array) { func = (typeof cb[0] == 'string') ? eval(cb[0] + "['" + cb[1] + "']") : func = cb[0][cb[1]]; } else if (typeof cb === 'function') { func = cb; } if (typeof func != 'function') { throw new Error(func + ' is not a valid function'); } if (typeof parameters == 'undefined') { var tmp_ary = []; var parameters = Array.prototype.slice.call(tmp_ary, 1); } return (typeof cb[0] === 'string') ? func.apply(eval(cb[0]), parameters) : (typeof cb[0] !== 'object') ? func.apply(null, parameters) : func.apply(cb[0], parameters); } function func1() { console.log("func1"); } function func2() { console.log("func2"); } function func3() { console.log("func3"); } // 使用示例 var myhook = new hooks(); myhook.addAction("loaded", func3); myhook.addAction("loaded", func2); myhook.addAction("loaded", func1); myhook.addAction("loaded", func3); myhook.doAction("loaded")
Category Archives: JavaScript
jQuery的AJAX示例
var textRet; var textJson; var textUrl; var timeoutMS; $.ajax( { type : 'POST', data : textJson, url : textUrl, dataType : 'json', timeout : timeoutMS, success : function(jsonRet) { //do something here textRet=...; }, error:function(jqXHR, textStatus, errorThrown) { if(textStatus==='error') { //do something here textRet=...; } if(textStatus==='timeout') { //do something here textRet=...; } } });
JavaScript checking for null vs. undefined
JS中undefined表示变量没有定义或从来没有赋值,而null是空对象,是有值的。
例如:
var a; alert(typeof a); //"undefined" a = null; alert(typeof null); //"object"
JS中==比较为弱类型比较,JS会自动进行类型转换,然后返回值的比较结果。
而===为强类型比较,即必须类型与值同时相同,才会相等。
例如:
alert(0 == "0"); //true alert(0==="0"); //false alert(undefined == null); //true alert(undefined === null); //false
判断变量为null:
if (a === null) // or if (a == null)
第一种方法,当a为undefined时返回false,
第二种方法,当a为undefined时返回true。
判断变量为undefined:
if (typeof a === "undefined") // or if (a === undefined) // or if (a == undefined)
第一、二种方法,当a为null时返回false,
第三种方法,当a为null时返回true。
还有一种使用falsey进行检查的方法:
if (!a) { // `a` is falsey, which includes `undefined` and `null` // (and `""`, and `0`, and `false`) }
大部分翻译自stackoverflow:
JavaScript checking for null vs. undefined and difference between == and ===
JS中的等于与不等于
js中
==与===
!=与!==
的区别为:
前者会进行类型转换,后者强制类型必须统一
JS中null与undefined
1.undefined是js的一个原始值,不是一个对象,表示变量没有初始化,
null也是js的一个原始值,不是一个对象,他表示变量为空,但由于语言设计的缺陷,导致typeof(null)为object,而正确的应该为null
alert(typeof(null)); // object alert(typeof(undefined)); // undefined alert(null !== undefined); //true alert(null == undefined); //true
2.object == null 与 !object 是不同的,因为!object相当于!Boolean(object)
alert(Boolean(null)); //false alert(Boolean(0)); //false alert(Boolean("")); //false alert(Boolean({})); //true alert(Boolean([])); //true
Table删除所有行
1.用jquery的话,还是很简单的
$("#tbid").empty();
2.但如果要保留前几行,比如前两行的话
function ClearTableData(tbid){ var rows = document.getElementById(tbid).getElementsByTagName('tr'); if(rows==null || rows.length<3)return; for(var i=2;i<rows.length;i++) { rows[i].parentNode.removeChild(rows[i]); } }
点击Table一行变色
function ExpendInstance(tbid,srow){ var ctrl = document.getElementById(tbid); if(ctrl==null)return; try { for(var i = 0; i < ctrl.rows.length;i++){ ctrl.rows[i].bgColor = "#ffffff"; } srow.bgColor = "#f7fac5"; } catch(ex) { alert(ex); } DoSomething(); }
JQuery动态加载Table
用于在同一Table显示两级内容
点击一次,会用ajax从服务器加载json数据,并添加到该行下面
再点击一次,会利用name属性,删除对应的行
function ExpendPatient(srow,pid){ var imgc = "#p"+pid+"imgc"; var imgo = "#p"+pid+"imgo"; if($(imgo).is(":visible")) { $(imgo).hide(); $(imgc).show(); delrows = document.getElementsByName("p"+pid+"study"); for (var i=0;i<delrows.length;i++) { delrows[i].parentNode.removeChild(delrows[i]); } return; } $(imgc).hide(); $(imgo).show(); aurl="xxxxxxxxxxxx?patPk="+pid; try { $.ajax({ url: aurl, dataType: 'json', error: function(XMLHttpRequest, textStatus, errorThrown){ alert('错误原因 ' + textStatus); alert('错误堆栈 ' + errorThrown); alert('返回字符 ' + XMLHttpRequest.responseText); }, success: function(data) { $.each(data,function(i,record){ r = '<tr height="30" name="p'+pid+'study" onclick="DoSomeThing(this,'+record["pk"]+');"]'; r += '<td></td>'; r += '<td>'+record["a"]+'</td>'; r += '<td>'+record["b"]+'</td>'; r += '<td>'+record["c"]+'</td>'; r += '<td>'+record["d"]+'</td>'; r += '<td>'+record["e"]+'</td>'; r += '<td>'+record["f"]+'</td>'; r += "</tr>"; $(srow).after(r); }); } }); } catch(e) { alert(e); } }
JS全选CheckBox
//type=1 全选 //type=2 全不选 //type=3 反选 function selectAll(form, type) { var elems = form.elements; for ( var i = 0 ; i < elems.length ; i++ ) { var e = elems[i]; if(e.type == 'checkbox') { switch(iType) { case 1: e.checked = true; break; case 2: e.checked = false; break; case 3: e.checked = !(e.checked); break; } } } } function checkAll() { var elems=document.getElementsByTagName( "INPUT "); for(i=0;i<elems.length;i++) { var e = elems[i]; if(e.type.toLowerCase()== "checkbox ")e.checked=true; } }
JS提交表单
function SubmitMyForm(url) { document.myForm.action = url; document.myForm.submit(); }