JS钩子示例

// 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")

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中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]);
	}
}

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&#91;i&#93;.parentNode.removeChild(delrows&#91;i&#93;);
        }
        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&#91;"pk"&#93;+');"&#93;';
                  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;
	}    
}