jQuery插件应该在文档中定义吗?

jQuery插件应该在文档中定义吗?,jquery,jquery-plugins,Jquery,Jquery Plugins,我不熟悉JavaScript和jQuery。在尝试使用我下载的几个jQuery插件失败后,我检查了$.fn,发现在调用document ready处理程序时,添加到其中的任何内容都丢失了。它在onclick等事件处理程序中也会失败 <script type="text/javascript" src="~/Scripts/jquery-1.7.1.min.js"></script> <script> jQuery.fn.myPlugin = funct

我不熟悉JavaScript和jQuery。在尝试使用我下载的几个jQuery插件失败后,我检查了$.fn,发现在调用document ready处理程序时,添加到其中的任何内容都丢失了。它在onclick等事件处理程序中也会失败

<script type="text/javascript" src="~/Scripts/jquery-1.7.1.min.js"></script>
<script>
    jQuery.fn.myPlugin = function () { alert("success"); };

    //works fine - alerts with "success"
    $(document).myPlugin();

    $(function () {
        //Uncaught TypeError: Object [object Object] has no method 'myPlugin'
        $(document).myPlugin();
    });
</script>

jQuery.fn.myPlugin=函数(){alert(“success”);};
//工作正常-警报显示“成功”
$(document.myPlugin();
$(函数(){
//未捕获的TypeError:对象[Object Object]没有方法“myPlugin”
$(document.myPlugin();
});

如果我将插件的定义移动到document ready处理程序中,那么之后一切正常(包括事件处理程序)。这就是应该怎么做的吗?我在网上找到的一切都清楚地表明了另一种情况。我正在使用Chrome及其内置开发工具。谢谢。

是的,你说得对。文档就绪回调就在那里,这样您就可以知道所有DOM元素和jQuery何时都可以使用了。实际的代码不必在回调中,但是您应该只在所有元素都准备好使用后初始化插件

例如,一个('click')处理程序必须在文档就绪回调中,但它执行的函数不必是-

$("#button").on('click',function(){
  btnClickHandler(); // this can be defined outside the ready callback.
});
所以你看,代码本身不需要用ready回调来封装,但是执行插件的代码应该在那里,因为只有这样你才知道你的文档已经准备好被操作了

将代码放在文档就绪回调中总是一个好主意。您还可以在不同的文件中有多个文档就绪回调—在DOM就绪后将立即调用每个回调。在多个就绪回调的情况下,您将它们写入页面的顺序将决定首先执行什么。始终首先引用jQuery,以便执行就绪回调


刚刚意识到jQuery在html文件末尾添加了第二个标记。它正在重新初始化,因此插件丢失。对我来说很好。你能在JSFIDLE中复制它吗?DOM应该不需要为扩展jQuery对象做好准备,它们是不相关的…我想这就是你的更新。对不起,伙计。我想出来了。顺便说一句,插件不应该在ready处理程序中定义。@bre-是的,对不起,我的回答有点模糊。你是对的。插件代码不必在那里,但是初始化/执行插件功能的代码需要在ready回调中。。。