jQuery $ .fn。功能未定义

时间:2014-05-08 10:47:36

标签: javascript jquery

我一直在制作我的第一个小jQuery插件 - 我使用的是带有标准功能的javascript,但决定将其捆绑到一个带有一些选项的jquery插件。

这是我的jquery代码的缩小版本:

(function($) {

        $.fn.responsiveNav = function( options ) {

            // Establish our default settings
            var settings = $.extend({
                selector         : '.responsive-nav'
            }, options);

            $( " " + settings.selector + " ul li" ).has( "ul" ).each(function() {
                $(this).addClass('responsive-nav-dropdown');
            });
            $( ".responsive-nav-dropdown" ).click(function() {
                $("ul",this).toggle();
            });

        }

    }(jQuery));

然后我通过执行以下操作在文档中调用此函数:

$( document ).ready(function() {
    responsiveNav();
});

但这导致函数未定义错误。我猜这是某种范围问题,但我找不到任何可以帮助我纠正这个问题。

3 个答案:

答案 0 :(得分:4)

$.fn构造用于在jQuery对象上定义方法。因此,您需要使用这样的插件:

$('#myElement').responsiveNav();

或者你可以把它作为jQuery变量本身的一个方法:

$.responsiveNav = function( options ) { // note: no .fn
    // your code...
}

// to call it:
$.responsiveNav({ /* options */ });

答案 1 :(得分:2)

(function($) {
   ///

    })(jQuery);

而不是

(function($) {
   ///

    }(jQuery));

另一件事:不要在设置中传递选择器。如果是这样,jQuery的用途是什么。

插件中的Jquery对象是this

.each(function(i,e) {}) 
// known that e is the current element in your loop
    $.fn.responsiveNav = function( options ) {
        var this=that; 
        var settings = $.extend({selector: '.responsive-nav'}, options);
    $(that).has( "ul" ).each(function(i,e) {
        $(e).addClass('responsive-nav-dropdown');
    });
    $( ".responsive-nav-dropdown" ).click(function() {
        $("ul",this).toggle();
    });
}

答案 2 :(得分:0)

您需要将其称为:

$("selector").responsiveNav();