0


例如,我有 jquery 插件,我调用了一个带有一些属性的 init 方法,如下所示:

jQuery(document).ready(function($) {
    $('#someid').somePlugin({
                           animation : 'fadeIn',
                           speed : '1000',
                           easing : 'swing'
                        });
});

假设我在页面上也有 html 链接。是否可以通过单击例如 html 链接以某种方式更改此插件的 init 函数的属性值?
因此,通过单击我想要更改速度属性的链接而不刷新页面。如果可能,执行此操作的最佳方式是什么?

或者,也许我应该先更改插件代码中的某些内容。插件代码:

(function($) {
    $.fn.extend({
        somePlugin: function(options) {

            var defaults = {
                speed : 500,
                animation : 'fadeIn',
                easing : false
            }

            var options = $.extend(defaults, options);
            var speed = options.speed;
            var easing = options.easing;
            var animation = options.animation;

            return this.each(function() {
                var obj = $(this);
                //some action here 
            });
        }   
    });
})(jQuery);
4

1 回答 1

-1

是的,你可以这样做:

$('#someid').somePlugin('option', 'animation', 5000);

此外,您可以通过以下方式一次更改多个选项:

$('#someid').somePlugin('option', {animation: 5000, otherOption: 'blah'});

我应该提到这仅在您使用“官方” jQuery 插件时才有效。许多插件作者都遵循这种设计模式,但并非所有人都这样做。此外,如果您使用jQuery UI Widget Factory开发插件,您将免费获得此功能。


编辑:由于 OP 正在编写他自己的插件,我们可以展示一个示例,说明如何使用自定义插件来促进此功能。直接取自jQuery 插件创作页面

(function( $ ){
  var methods = {
    init : function( options ) { 
      //Extend options here with your 
      //defaults and init your plugin
    },
    option: function( key, value ){
       options[key] = value;
    }
  };

  $.fn.somePlugin = function( method ) {
    // Method calling logic
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      //some error that method doesnt exist
    }    

  };

})( jQuery );

$('div').somePlugin({someOption: true});
//..later
$('div').somePlugin('option', 'someOption', false);
于 2013-02-08T22:27:35.777 回答