当前位置:嗨网首页>书籍在线阅读

66-解决方案

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.16.2 解决方案

确定jQuery是不是问题来源的方法之一是用不包含jQuery的其他JavaScript代码代替你的jQuery代码。在这个例子中,可以用简单的 alert() 替代jQuery代码:

function delayLog( text ) {
   setTimeout( "alert(text)", 1000 );
}

当尝试这个版本的代码时,发生了同样的问题:没有显示警告信息,Firebug同样报告 text 未定义。

这并没有确定问题所在,但是已经大大缩小了范围。很明显,这不是jQuery的问题(除非jQuery程序库的存在妨碍了你的页面,但是你可以在一个不包含jQuery简单的测试页面中运行上述代码,排除这种可能性)。所以,问题肯定出现在代码自身,最有可能与使用serTimeout()的方式有关。

确实,这里的问题是当 setTimeout() 接受一个字符串参数时,它执行于全局作用域,也就是说,它位于任何函数之外。最简单的修复手段就是使用一个局部函数作为回调,代替文本字符串:

function delayLog( text ) {
   setTimeout( function() {
     alert(text);
   }, 1000 );
}

和以字符串方式调用 setTimeout() 的代码不同,嵌套的函数完全能够访问外部函数的变量和参数。所以,这段代码能够按照预期显示文本警告。

最后,原来的jQuery代码修改如下:

function delayLog( text ) {
   setTimeout( function() {
     $('#log').show().html(text);
   }, 1000 );
}