Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使jQuery插件函数可以单独调用,而不在集合上运行_Javascript_Jquery_Jquery Plugins_Plugins - Fatal编程技术网

Javascript 如何使jQuery插件函数可以单独调用,而不在集合上运行

Javascript 如何使jQuery插件函数可以单独调用,而不在集合上运行,javascript,jquery,jquery-plugins,plugins,Javascript,Jquery,Jquery Plugins,Plugins,我读了这本书,对此很熟悉。然而,给出的示例总是对一组先前匹配的元素进行操作。我想创建一个可以同时执行以下两项任务的函数: // example usage of my to-be-created plugin function // this is the way described in the docs, and I know how to do that $("a").myFunction () // but I also want to be able to call the fun

我读了这本书,对此很熟悉。然而,给出的示例总是对一组先前匹配的元素进行操作。我想创建一个可以同时执行以下两项任务的函数:

// example usage of my to-be-created plugin function

// this is the way described in the docs, and I know how to do that
$("a").myFunction ()

// but I also want to be able to call the function without a collection:
$.myFunction ();
如果调用
$.myFunction()
时没有对集合进行操作,它将创建自己的集合,其中包含要匹配的元素—类似于初始化过程(但不一定只运行一次)。另外,
$.myFunction()
应该保持可链接性

我想要实现的伪代码:

// [...]
function myFunction (): {
    if (notCalledOnACollection) {
        // this should run when called via $.myFunction ()
        $elements = $("a.myClass");
    }
    else {
        $elements = $(this);
    }
    return $elements.each (function () {
        // do sth. here 
    });
}
我真的希望将所有函数实现/功能都放在一个函数定义中,而不是在jQuery对象中的两个单独的位置有两个单独命名的函数或两个同名的函数

当然,我可以添加一个参数
myFunction(do_init)
,它指示执行
if
语句的哪个分支,但这会使我的参数列表变得混乱(我想对多个插件使用这种方法,为了简单起见,
myFunction()
中会有参数


有什么好的建议吗?

只需在插件定义中添加另一个引用,您就可以轻松使用标准插件代码:

(function( $ ) {
    $.myPlugin = $.fn.myPlugin = function(myPluginArguments) {
        if(this.jquery)
            //"this" is a jquery collection, do jquery stuff with it
        } else {
            //"this" is not a jquery collection
        }
    };

    $.fn.myPlugin.otherFunc = function() {
    };
})( jQuery );
这里唯一的区别是
$.myPlugin=
部分,它允许您直接调用插件,而无需运行jquery的选择器函数。如果您决定需要其他函数或属性,您可以将它们创建为插件的属性

用法:

//using a selector (arguments optional)
$(".someClass").myPlugin();

//using the options variable - or whatever your arguments are
$.myPlugin({id: "someId"});

//accessing your other functions/properties
$.myPlugin.otherFunc();

我对你的解决方案有严重的问题。我已经在JSFIDLE上复制了您的方法:但一旦我运行了
$.myPlugin()
,所有经过测试的浏览器都会消耗100%的CPU并卡住(在Linux和Windows上使用FF进行了测试,在Mac上使用Safari进行了测试)。我在我的机器上没有看到这个问题。我现在在恐龙身上。此外,JSFIDLE不应该用于性能测试,它们已经加载了大量的额外功能。我也在本地进行了测试,也没有发现问题。我真的很怀疑你所看到的与这段代码有什么关系。你是否取消了JSFIDLE的js部分中的行注释?否则它就跑不动了!我现在在大学,可以使用一堆计算机,我可以在3台物理上不同的机器上重现100%的cpu消耗。使用(取消最后一行的注释)并点击run将阻止/结束Fedora 17上的脚本:Firefox 14.0.1,Chrome 22;Windows7:Firefox14,IE9;OSXLion:Safari5,Firefox14。所以它是绝对可复制的。这与JSFIDLE无关,将该脚本与jQuery1.8.0和run一起复制显示了相同的效果。。问题不在于我上面的代码,而是
$(this)。您添加到其中的每个
。如果不发送选择器,则不能以相同的方式使用
this
(没有选择器,就没有集合,因此就没有集合对象)。我已经更新了您的,以演示
这个
对象有无选择器的区别。啊,您是对的,我混淆了if/else分支。我现在做
if(this.jQuery==undefined){//构建集合}/*用集合做某事*/