// 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();
}