【问题标题】:Call a function assigned in jQuery Plugin Options调用在 jQuery 插件选项中分配的函数
【发布时间】:2011-07-29 10:53:59
【问题描述】:

我做了一个 jQuery 插件。现在我想在 jQuery 插件的选项中分配一个 jQuery 动画(带回调):

(function($){  

$.fn.jPl = function(options) {

var $e = $(this);

var defaults = {
    showEffect:     jQuery.noop,
    hideEffect:     jQuery.noop, 
};  

var options = $.extend(defaults, options); 

var onSuccess = function ( ) {

    $e.options.hideEffect ( function () {

        render(function () {

            $e.options.showEffect ( function ( ) {

                if ( waitTime < options.minWait ) waitTime = options.minWait;
                setTimeout ( function ( ) { refreshWall ( ) } , waitTime * 1000 );
                waitTime = 0;

            });


        })

    });

}

}})(JQuery);

呼叫:

    $( "#obj" ).jPl ( {

      showEffect: $.fn.showEffect,
      hideEffect: $.fn.clearEffect,

    } ) ;

现在我得到这个错误:

未捕获的 ReferenceError: showEffect 未定义

showEffect 已定义,当我在插件中调用它时,它工作正常。

================== 编辑 showEffect 和 clearEffect 在另一个 JS 文件中定义:

    (function($) {
      $.fn.clearEffect = function( callback ) {

        return this.each(function() {

          $(this).hide ( function ( ) {


            if (typeof callback == 'function') { // make sure the callback is a function
              callback.call(this); // brings the scope to the callback
            }


          });

        });
      }

      $.fn.showEffect = function( callback ) {

        return this.each(function() {

            $(this).show ( function ( ) {

            if (typeof callback == 'function') { // make sure the callback is a function
              callback.call(this); // brings the scope to the callback
            }


          });

        });

      }
    })(jQuery);

我认为,调用这样的函数是一个错误:$e.options.showEffect - 但我不确定。

非常感谢。

【问题讨论】:

  • showEffectclearEffect $.fn 的属性,而不是 $
  • 抱歉,已更改。但是得到同样的错误

标签: jquery jquery-plugins


【解决方案1】:

根据给出的代码,您的showEffect 函数存在于插件范围内,但不在插件范围之外。

除非您在用于创建插件的匿名函数之外声明了另一个名为 showEffect 的函数,否则您将收到您收到的错误。

【讨论】:

    【解决方案2】:

    您的示例可能不完整,因为我很难相信某些代码确实有效。

    $e.options.showEffect 不起作用,因为 options 是一个局部变量;你需要声明 this.options 而不是 var options;

    var defaults = {
        showEffect:     function,
        hideEffect:     function, 
    }; 
    

    函数应替换为jQuery空函数jQuery.noop,因为您的版本可能无法在所有浏览器中运行

    但是,如果您收到第一个错误 Uncaught ReferenceError: showEffect is not defined,那么我认为 showEffect 它没有定义在您调用插件的同一范围内,如 此代码会引发其他错误,但不是您拥有的错误:

     function showEffect() {
     }
    
     function clearEffect() {
     }
    
     $("#obj").jPl ( {
    
      showEffect: showEffect,
      hideEffect: clearEffect
    
    } ) ;
    

    【讨论】:

    • 嗨!谢谢您的回答! showEffect 和 clearEffect 也是 jquery 插件(我将它们附加在主帖中)。我用函数替换 null,javascript 返回一个“意外的令牌” - 异常。所以我用 jQuery.noop 替换了它,现在我得到了这个错误: Uncaught TypeError: Cannot call method 'hideEffect' of undefined $e.options.hideEffect (function () { but i defined hideEffect in my options (not the defaults)? :( 谢谢 :(
    • 嗨,正如我在我的主要帖子选项中所说,它不可访问,因为它被声明为局部变量。将“var options = $.extend(defaults, options);”替换为“this.options = $.extend(defaults, options);”它会起作用;你也不应该使用 $.fn.showEffect :),只需 $.showEffect; fn 是 jquery 对象的原型,只有在声明新函数(插件)时才使用它
    • 嗨!谢谢您的回答。不幸的是,这不是问题:( 我将其更改为“this.options = ...”和“$e.options.hideEffect” - 但我得到了同样的错误:“Object [object Object] has no method 'hideEffect '" - 这很奇怪,但是当我将 $e.options.hideEffect 替换为 $e.clearEffect(oder JS 文件中定义的插件)时 - 它可以工作。:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2013-12-19
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多