JQuery - Widget Public Methods

前端 未结 6 1223
野性不改
野性不改 2020-12-24 11:59

If I create a JQuery widget (code example below), and then define a \"public\" method, is there any other way to call the method other than using the following form?

相关标签:
6条回答
  • 2020-12-24 12:36

    Slightly off-topic, I know, but you may want to look at jquery Entwine.

    This provides a form of inheritance and polymorphism which allows some clever behaviour with simple code. It sounds like this would do what you are trying to do.

    0 讨论(0)
  • 2020-12-24 12:47

    jQuery UI widgets use jQuery's $.data(...) method to indirectly associate the widget class with the DOM element. The preferred way to call a method on the widget is exactly what was described by Max...

    $('#list').list('publicMethod');
    

    ...but if you want to field a return value, you'll have better luck calling it this way, via the data method:

    $('#list').data('list').publicMethod();
    

    However, using the second way side-steps the whole jQuery UI widget pattern, and should probably be avoided if possible.

    0 讨论(0)
  • 2020-12-24 12:49

    lets say you have list, list2, and superList... let's call "publicMethod" on for each of them:

    $.fn.callWidgetMethod = function(method) {
      var $this = this,
          args = Array.prototype.slice.call(arguments, 1);
    
      // loop though the data and check each piece of data to
      // see if it has the method
      $.each(this.data(), function(key, val) {
        if ($.isFunction(val[method])) {
          $this[key].apply($this, args);
    
          // break out of the loop
          return false;
        }
      });
    }
    
    $("#some-element").list();
    $("#another-element").list2();
    $("#hydrogen").superList();
    
    $("#some-element").callWidgetMethod("publicMethod");
    $("#another-element").callWidgetMethod("publicMethod");
    $("#hydrogen").callWidgetMethod("publicMethod");
    
    0 讨论(0)
  • 2020-12-24 12:50

    How about this one:

    $("#list").list.publicMethod
    

    As you are extending ui.list with your key:value pair set

    0 讨论(0)
  • 2020-12-24 12:59

    Try this:

    $("#list").list("publicMethod");
    
    0 讨论(0)
  • 2020-12-24 13:00

    This solution is inspired by @Jiaaro's solution, but I needed a return value and implemented as a JavaScript function rather than extending jQuery:

    var invokeWidgetMethod = function(methodName, widgetElem)
        {
            var $widgetElem = $(widgetElem),
                widgetData = $widgetElem.data(),
                dataName,
                dataObject;
    
            for(dataName in widgetData)
            {
                dataObject = widgetData[dataName];
                if ($.isFunction(dataObject[methodName])) {
                    return dataObject[methodName]();
                }
            }
        }
    
    0 讨论(0)
提交回复
热议问题