为什么这段代码不起作用(以及如何修复它)?

这个问题是我的另一个问题的结果。

代码是:

 var scripts = [ "http://www.---.com/include/jquery-1.8.3.min.js", "http://www.---.com/include/functions.js", "http://www.---.com/include/myjs.js", "http://www.---.com/include/plugins/bxslider/bxslider.js" ]; function downloadJSAtOnload() { for( var i=0; i<scripts.length; i++ ) { var element = document.createElement('script'); element.src = scripts[i]; document.body.appendChild(element); } $(document).ready(function(){ $('#mainslide .bxslider').bxSlider({ slideWidth: '960', mode: 'vertical', speed: '500', captions: false, pager: false, controls: false, nextText: 'Next', prevText: 'Prev', auto: true, autoHover: true, pause: 3000 }); }); } if (window.addEventListener) window.addEventListener('load', downloadJSAtOnload, false); else if (window.attachEvent) window.attachEvent('onload', downloadJSAtOnload); else window.onload = downloadJSAtOnload;  

生成的错误是“未捕获的ReferenceError:$未定义”

奇怪的是,在许多浏览器和版本中,一切都很完美(幻灯片,灯箱,…)。 只是在IE8和Safari 4中,向用户显示警报。

由于您是动态地将JS库添加到文档中,因此在加载脚本之后需要一个回调函数来初始化bxSlider。 理想情况下,应在bxSlider加载后调用回调。

 element.setAttribute("type","text/javascript"); element.onload = callBackFunction; document.body.appendChild(element); var callBackFunction() { $('#mainslide .bxslider').bxSlider({ slideWidth: '960', mode: 'vertical', speed: '500', captions: false, pager: false, controls: false, nextText: 'Next', prevText: 'Prev', auto: true, autoHover: true, pause: 3000 }); } 

这些浏览器在到达第一个$之前在body中创建script元素之后实际加载jQuery文件可能太慢$

为什么不在文档headscript标记中声明它们?

您将脚本添加到文档正文(它们应该在头脑中)但是在$(document).ready(...)访问jQuery之前不要等待它们下载和执行,所以我希望这样做至少在某些时候失败了。 您需要在不使用jQuery的情况下附加到文档onready事件。

单独导入jquery示例

  

将您的函数从document.ready()中取出并将其添加到jQuery.js文件的末尾。 这样它只会在jQuery加载后运行。