【问题标题】:jQuery UI - Override plugin methodjQuery UI - 覆盖插件方法
【发布时间】:2011-08-31 10:54:31
【问题描述】:

关于我习惯的经典 OOP,我无法在 jQuery UI 中掌握 OOP。

据我所知,我创建了一个名为“modal”的新插件(小部件),它扩展了 UI 对话框小部件。现在如何覆盖对话框的close() 方法,同时调用原始方法,以免失去其功能?

$.widget('ui.modal', $.ui.dialog, {

    close: function() {

        // How do I do something to the current modal DOM object?
        // Is this correct?
        $(this).addClass('test');

        // Then call the parent close() method to keep all original
        // functionality of dialog.close()
        // ???

    }
});

$.extend($.ui.modal);

【问题讨论】:

    标签: jquery jquery-ui jquery-ui-dialog


    【解决方案1】:

    当 $.ui.dialog 有一个可以挂钩的关闭事件时,为什么要使用新的关闭函数覆盖它?查看以下链接中的事件选项卡:

    http://jqueryui.com/demos/dialog/#modal

    页面中的代码示例:

    提供一个回调函数来处理关闭事件作为初始化选项。

    $( ".selector" ).dialog({
       close: function(event, ui) { ... }
    });
    

    按类型绑定到关闭事件:dialogclose。

    $( ".selector" ).bind( "dialogclose", function(event, ui) {
      ...
    });
    

    编辑

    回答问题:

    (function($){
        var dialogExtensions ={
            oldClose: $.ui.dialog.prototype.close,
            close: function(event){
                this.oldClose(event);
                // custom code
            } 
        };
        $.extend($.ui.dialog.prototype, dialogExtensions);
    })(jQuery);
    

    【讨论】:

    • 我已经有了,但这并不能解决需要调用原始关闭方法以及我自己的自定义代码的问题。这将完全覆盖 close 方法。
    • 你到底在说什么?这不会覆盖原始的关闭功能。这与对话框关闭时发生的事件挂钩。 jsfiddle.net/H2YQq
    • 还有一个 beforeClose 事件,如果你希望你的代码在对话框关闭之前发生,你可以加入它...
    • 不,但您只是挂钩到特定选择的对话框的关闭事件。您不会更改对话框插件,以便所有对话框都会在其正常关闭方法中发生某些事情。
    【解决方案2】:

    Here 是我找到的一个例子。我觉得它清晰而有用:

    // If you dont need to call original method
    $.widget("ui.addresspicker", $.extend({}, $.ui.addresspicker.prototype, {
      _updatePosition: function(){
        // Do what you want to
      }
    }));
    
    // If you need to call original method
    var orig_updatePosition = $.ui.addresspicker.prototype._updatePosition;
    $.widget("ui.addresspicker", $.extend({}, $.ui.addresspicker.prototype, {
      _updatePosition: function(){
        // Do what you want to
        // Call original widget method  
        orig_updatePosition.apply(this, arguments);
      }
    }))
    

    【讨论】:

      【解决方案3】:

      我不确定 jQuery UI。真的不喜欢。

      但认为你可以做这样的事情。

      $.widget('ui.modal', $.ui.dialog, {
      
          close: function() {
      
              $(this).addClass('test');
      
              $.ui.dialog.close.call(this, arguments);
              // Using method call to call the original close method from dialog
              // The sweet thing about call is you can pass this to it.
              // Sending any arguments you maybe get from the function initialize. close('argument 1', 'argument 2', etc...) 
      
          }
      });
      
      $.extend($.ui.modal);
      

      安德烈亚斯

      【讨论】:

      • 当我尝试关闭我的对话框时收到错误$.ui.dialog.close is undefined
      • 我不知道。只是觉得从$.ui.dialog.close 得到它是显而易见的。抱歉我的回答不好:(。希望你能找到你的帮助。
      • 好的。在此文件中:code.jquery.com/ui/jquery-ui-git.js 启动 line 9817 从 ui.dialog 启动原始关闭方法。希望
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多