【问题标题】:enhance.js libraries onScriptLoaded running before jQuery loaded在加载 jQuery 之前运行的 enhance.js 库 onScriptLoaded
【发布时间】:2010-11-09 14:01:21
【问题描述】:

查看 Filament Group 的 this demo 使用他们的 Progressive Enhancement enhance.js

修改为:-

<script type="text/javascript" src="../_shared/EnhanceJS/enhance.js"></script>
<script type="text/javascript"> 
// Run capabilities test
enhance({
loadScripts: [
 {src: 'js/excanvas.js', iecondition: 'all'},
 '../_shared/jquery.min.js',
 'js/visualize.jQuery.js',
 'js/example.js'
],
loadStyles: [
'css/visualize.css',
'css/visualize-dark.css'
] 
}); 

    alert($);

</script> 

我在警报中收到“$ 未定义错误”,可能是因为 jQuery 尚未加载。

注意 - alert($) 仅用于调试 - 我正在尝试用它做一些事情,例如$('some-selector') - 并且没有 $(handler) 或 $(document).ready 等也不起作用 - jquery 未加载,$ 未定义。

enhance 的 onScriptLoaded 看起来应该可以解决问题,但如果我添加了

onScriptsLoaded:[runMyCode()]

以后

function runMyCode()
{
    alert("runMyCode was called");
    alert($);
}

第一个警报有效,但 $ 仍未定义。

如果我在按钮的单击事件上调用 runMyCode,它确实有效。

所以问题是 - 一旦所有脚本都完成了 enhance.js 的加载,你如何运行代码?

附注在 IE8/FF3/Chrome7 中验证了同样的问题

【问题讨论】:

  • 对于调试,您应该使用控制台和console.log($) 来查看对象的树状资源。
  • @Robert - 它的 $(document).ready 不是 $(document).read - 回滚您的编辑。 api.jquery.com/ready

标签: javascript jquery progressive-enhancement


【解决方案1】:

我想这就是你所追求的,注意onScriptsLoaded is used directly as a callback,所以它应该是一个函数,而不是一个数组:

enhance({
   loadScripts: [
    {src: 'js/excanvas.js', iecondition: 'all'},
    '../_shared/jquery.min.js',
    'js/visualize.jQuery.js',
    'js/example.js'
   ],
   loadStyles: [
    'css/visualize.css',
    'css/visualize-dark.css'
   ],
   onScriptsLoaded: function() { alert($); }
});

或者更一般地,对于一个函数,只传递这样的引用:

   onScriptsLoaded: runMyCode

onScriptsLoaded:[runMyCode()]“某种”起作用的原因是它立即调用了runMyCode 函数(在此行运行时,不是脚本完成时)并根据该结果创建一个数组。这实际上会在脚本完成时引发错误,因为 onScriptsLoaded 应该是一个回调函数,而不是一个数组。

【讨论】:

  • @Pointy - 我知道他现在哪里出了问题,期待直接的函数参考
  • 是的,我编辑了我的答案——我猜想这个库可能会接受一系列函数,尽管这当然是非常规的。
【解决方案2】:

我认为这可能是个问题:

onScriptsLoaded:[runMyCode()]

你试过了吗(假设数组符号是正确的):(edit——它是正确的)

onScriptsLoaded: [runMyCode]

?第一种方式,您在设置库时调用您的函数。您只想将引用传递给您的函数。

edit 实际上应该是:

onScriptsLoaded: runMyCode

我不知道数组是从哪里来的; “enhance.js”文档中绝对没有提到它。

【讨论】:

  • 恐怕不是这样 - 必须是 [runMyCode()] 并且函数正在被调用(你会得到第一个警报) - 它在 $ 之前被调用是由 jQuery 库定义的。跨度>
  • 为什么它“必须是[runMyCode()]?这没有意义。你试过我的建议了吗?当然你会收到警报 - 你正在调用函数因此它将在您设置“增强”库时运行,而不是在加载脚本时运行。
  • 我很确定@Pointy 是对的,@Ryan - 您需要传递函数指针,以便增强以后可以调用它。如果你用runMyCode()传递它,函数将被执行,结果将被传递给enhanced。
  • 是的,我确实尝试了您的建议,第一个版本 - 这是错误的。除非你比白人更白,否则不要变得很马虎! ;) 感谢您的帮助 +1
  • 对此很抱歉 - 我不熟悉“enhance.js”,我在查看其文档之前输入了它:-)
猜你喜欢
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
相关资源
最近更新 更多