JavaScript系列一个很重要很实用但鲜为人知js函数.希望对大家有益
前面写了一篇文章[一个更好用更高效的ajax框架XCallback]
地址:http://www.cnblogs.com/chenxumi/archive/2009/01/06/1370677.html
感兴趣可以看看,在引出这个函数之前,先看看这段XCallback的js代码:
function js_method(id)
{
Ajax.Reg("[数据]","server_method",js_method);
return;
$1(id).innerHTML=Ajax.X;
}
这三步就完成了ajax调用过程 ,return之前的函数体是调用前要进行的操作,return之后是数据返回后要做的操作. Ajax.X 是服务器返回的数据,注意到$1(id).innerHTML=Ajax.X; 这条语句用到了id,试想在函数初次调用时在retrun就已经返回了那么数据从服务器段返回后在这执行$1(id).innerHTML=Ajax.X; 时是怎么知道id值得呢 熟悉json开发的人也许会立即想到eval(),的确这个是js里的顶级函数,可以执行一段js代码,但是eval()的函数执行的范围会限制在调用它的函数体内 ,也就是变量只能在他调用的函数内有效。例如:
function testeval(){
eval("var id=1");
alert(id);
}
alert(id);
第一个alert可以弹出1 但是第二个alert将会找不到对象
所以id的使用范围也限制在了testeval函数里,再看看上面XCallback的代码,return前后的id必然会在两个函数里执行,而且给id 赋值的函数和服务器返回结果后要调用的js函数不可能在同一个函数里,那有没有可以执行全局变量的js函数,是有的 ,找了很长时间才找到在IE里有个函数execScript()可以执行全局变量,用google了一下有 29,700项结果,而eval()有13,100,000项结果,的确JSon这么火,也少不了这个
函数。注意这个函数容易出 "80020101 操作无法完成的错误" ,这多是要执行的js代码不规整导致的,例如如果写js代码后面没写";" ,就有可能出现此错误。刚才用ie打开博客园的编辑器时就出了这个对话框,所以一直不能用,无奈发布这篇日志就用了firefox,刚才说的是IE,那firefox下有没有执行全局变量的函数,答案是肯定的,要不这个编辑器在firefox下就打不开了,firefox下是:window.eval(),也许大家很疑惑 这和 eval()没啥区别,的确也是if(eval()==window.eval()) 返回的是true,但是firefox全局变量的执行只能用window.eval()。
XCallback里有个函数Ajax.Eval()对以上两个方法给了封装,你可以很方便的调用
Ajax.Eval=function(code){
if (window.attachEvent && !window.opera) {
execScript(code);
}
else
window.eval(code);
}
另外还封装了一个常见方法可以获得服务器端返回字符串的js代码: Ajax.Script(code);
如果觉得方便就用吧
最后希望大家看看这个ajax框架XCallback 严格讲我是个很苛刻挑剔的人,对当今一些主流框架在ajax使用上都不是很满意, 但是很喜欢XCallback, 有兴趣地看看 ,示例、程序集、源码及注释都有
http://chenxumi1.vhost015.cn/