需要我的 jquery 插件帮助

问题描述 投票:0回答:3

上周制作了一个函数,用于省略某些选择器内的文本。

我是这样调用函数的:

ellipsiText('.class',50) 传递选择器和我想要的文本的最大长度。这工作正常,但我试图使其成为一个插件,像这样调用: $('.class').ellipsiText(50).

所以,我正在阅读jquery网站上的教程,我明白了如何做到这一点。但我认为我对“this”选择器有疑问。这是我原来的功能:

function ellipsiText(selector,maxLength){


    var array = $(selector).map(function(){
        return $(this).text();
    }).get();

    var i;

    var teste = [];

    for (i=0;i<array.length;i++){

        if (array[i].length > maxLength){

        teste.push(array[i].substr(0,maxLength) + "...");

        } else {

            teste.push(array[i]);
        }
    }

    for (var i=0;i<teste.length;i++){

    $(selector).each(function(i){

        $(this).text(teste[i]);

    });

    }


}

这是我制作 jquery 插件的尝试:

(function ($) {

    $.fn.ellipsiText = function(length){

        var array = $(this).map(function(){
            return $(this).text();
            }).get();

        var i;
        var teste = [];

        for (i = 0; i < array.length; i++){
            if (array[i] > length){
                teste.push(array[i].substr(0,length) + "...");
            } else {
                teste.push(array[i]);
            }
        }

        $(this).each(function(i){

            $(this).text(teste[i]);

        }); 
    };

}(jQuery));

我做错了什么?

javascript jquery this
3个回答
2
投票

好吧,第一件事不是问题,但是您可以使用

$(this)
代替第一个函数作用域中的
this.map/this.each

问题是,在第二个代码中你所做的

if (array[i] > length)

而不是

if (array[i].length > length)

与 jQuery 插件无关!

http://jsfiddle.net/UY88r/


0
投票

这是未经测试的,但基本结构是这样的。当需要一个循环时,您的代码中也会有很多循环。

$.fn.ellipsiText= function(options) {

    var settings = $.extend({  //nice way to give to give defaults
        length : 50,
        ellipsi : "..."
        }, options );

    return this.each(function() {  //the return is needed for chaining
        var elem = $(this);
        var txt = elem.text();
        if (txt.length>settings.length) {
             elem.text(txt.substr(0,settings.length) + settings.ellipsi );
        }
    });

};

并调用它

$( "div.defaults" ).ellipsiText();

$( "div.foo" ).ellipsiText({
    length : 10
});

$( "div.more" ).ellipsiText({
    length : 10,
    ellipsi : "<more>"    
});

0
投票

您已经有了一个可以工作的功能,只需使用它即可。

$.ellipsiText = ellipsiText;
$.fn.ellipsiText = function (count) {
    ellipsiText(this, count);
}

现在您可以像以下任何一个一样使用它:

ellipsiText('.class',50);
$.ellipsiText('.class',50);
$('.class').ellipsiText(50);

当你可以使用已经可用的功能时,重写它是没有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.