第一个jQuery插件:TagCloud

时间:2009-12-18 05:13:18

标签: jquery jquery-plugins

这是我的第一个jQuery插件。我可以得到一些指示吗?它目前无法正常工作......

; (function($) {

$.fn.tagCloud = function(options) {
        options = options || {};

    var maxPercent = options['maxPercent'] || 150;
    var minPercent = options['minPercent'] || 100;
    var retrieveCount = options['retrieveCount'] || function(element) { return $(element).attr('rel'); };
    var apply = options['apply'] || function(element, size) { $(element).attr('style', 'font-size:' + size + '%;'); };

    var max = null;
    var min = null;

    var tagElements = this;

    tagElements.each(function(element) {
        count = retrieveCount(element);
        max = (max == null || count > max ? count : max);
        min = (min == null || min > count ? count : min);
    });

    var multiplier = (maxPercent - minPercent) / (max - min);

    tagElements.each(function(element) {
        count = retrieveCount(count);
        size = (minPercent + (count - min) * multiplier);
        apply(element, size);
    });
}
})(jQuery);

用法:$('a.tag').tagCloud();

2 个答案:

答案 0 :(得分:1)

使用一组静态默认值而不是硬编码。这样,用户可以覆盖它们,而不必在调用中设置它们,例如:

$.fn.tagCloud.defaults = {
    maxPercent: 150,
    minPercent: 100,
    countCallback: function(element){return $(element).attr('rel');},
    applyCallback: function(element, size) { $(element).attr('style', 'font-size:' + size + '%;');}
};

然后在你的插件的最开始,你将用一个简单的替换很多var声明:

var o = $.extend($.fn.tagCloud.defaults, options||{});

然后您将使用o.*o['*'] ID访问所有内容,同时也使您的某些逻辑成为封装的方法。我通常只希望/期望看到一个this.each()块用于主要逻辑。

另外,我相信如果你的选择器在其集合中没有任何元素,你将被除以0或NaN,这通常是禁止的。如果我是正确的你可能想要默认最小/最大为1或做一个简单的检查,以确保收集长度是> 0,如果不是取决于你想要它做什么,就会纾困。

答案 1 :(得分:0)

我明白了:

; (function($) {

$.fn.tagCloud = function(options) {
    options = options || {};

    var maxPercent = options['maxPercent'] || 150;
    var minPercent = options['minPercent'] || 100;
    var retrieveCount = options['retrieveCount'] || function(element) { return $(element).attr('rel'); };
    var apply = options['apply'] || function(element, size) { $(element).attr('style', 'font-size:' + size + '%;'); };

    var max = null;
    var min = null;

    var tagElements = this;

    tagElements.each(function(index) {
       var count = retrieveCount(this);
        max = (max == null || count > max ? count : max);
        min = (min == null || min > count ? count : min);
    });

    var multiplier = (maxPercent - minPercent) / (max - min);

    tagElements.each(function(index) {
       var count = retrieveCount(this);
        size = (minPercent + (count - min) * multiplier);
        apply(this, size);
    });
}
})(jQuery);