Javascript 如何从插件外部访问jQuery插件中的函数?

Javascript 如何从插件外部访问jQuery插件中的函数?,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,以以下形式的插件为例: jQuery.autocomplete = function(input, options) { function abc(){} function def(){} } 这些函数运行良好,符合预期。但是,我希望能够调用函数abc();来自$(document).ready(函数(){});陈述下面的方法行不通,我真的想听听你的建议 $(document).ready(function() { jQuery.autocomplete.abc();

以以下形式的插件为例:

jQuery.autocomplete = function(input, options) {
    function abc(){}
    function def(){}
}
这些函数运行良好,符合预期。但是,我希望能够调用函数abc();来自$(document).ready(函数(){});陈述下面的方法行不通,我真的想听听你的建议

$(document).ready(function() {
    jQuery.autocomplete.abc();
    abc();
    $(this)->abc();
}

自动完成函数必须以某种方式显式地使这些函数可用,可能是通过在某个全局对象上放置对它们的引用。否则,它们将完全对外界隐藏,并且无法访问。

在jQuery中,私有函数(如您在问题中描述的函数)通常与实例绑定。在函数内部,它们使用一个局部作用域变量或
this
关键字与实例交互。因此,我不认为从onload调用它们有什么意义。如果插件开发正确,作者将在必要时实现回调;但是,回调将通过实例分配,而不是全局分配

如果您正在编写此插件,并且想要此行为,则语法可能如下所示:

jQuery.autocomplete = function(input, options) {} 
jQuery.autocomplete.abc = function(){};
jQuery.autocomplete.def = function(){};

这些函数可以通过
$进行全局访问。autocomplete

好的,当您在一个框中键入时,jQuery插件将div添加到标记云中。单击其中一个“标记”将其添加到辅助列表中。单击辅助列表可从辅助列表中删除该项目。然后,我希望通过单击将该项添加到主列表中,前提是它与输入框中的文本匹配。出于这个原因,我想再次运行自动完成代码。为了解决这个问题,我在我的私有代码中添加了一个辅助函数,它使用“click”事件而不是“keydown”。这使我能够向次要列表中的div添加一个触发器(“单击”),从而再次触发自动完成操作。问题解决了。没有你们的帮助,我是不可能弄明白的。谢谢大家!

在插件的init中有以下内容时

if( !data ) {
    /* Settings Extraction */
    $.extend(s, defaults, options);
    /* Initialize Code */
    /* Data Storage */
    var YoPlugin = $('<div />', {
        text : $this.attr('title')
    });
    $(this).data('YoPlugin', {
        target : $this,
        myInternalFunction: myInternalFunction,
        settings : $.extend({}, s),
        YoPlugin : YoPlugin
    });
    data = $this.data('YoPlugin');
}
我想添加一个链接作为外部插件参考会更好 ie like init:在插件中声明 或经 $.fn.YoPlugin.myInternalFunction

无论如何,这组片段揭示了一个晚上的研究与开发,以探索和帮助了解什么是lir-bir betta

而且你肯定需要阅读所有你能在这里吸收的东西


这是您正在编写的某个插件,还是您试图访问其他插件的内部功能?嗯,不是“完全”。总是有
Function.toString()
hack从函数中强制提取内部函数…是的,但你最好创建新函数;你仍然没有真正了解这些函数,尤其是闭包中的任何东西。是的,我真的不想走上重新设计函数的道路。如果我可以在文本框上调用keydown事件,我可能会让我的系统工作。这是可能的吗?内部函数是私有的,除非通过返回它们或其他方法向调用方公开,正如Pointy所说。如果这是您的代码,您可以创建一个新的公开方法。。。否则,您必须破解它们的代码,但在本例中,函数jQuery.autocomplete.abc=function(){}是否可以引用jQuery.autocomplete=function(input,options){}中的其他函数?我能够引用$.autocomplete.abc();这并不能解决我的全部问题。
var multiSel = $('.YoPlugin');
var singleSel = multiSel[0]; //or other way to select the singleton or specific plugin enhanced target
var pluginDataObj = $(singleSel).data('YoPlugin');
var func = pluginDataObj['myInternalFunction'];
func();