上周制作了一个函数,用于省略某些选择器内的文本。
我是这样调用函数的:
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));
我做错了什么?
好吧,第一件事不是问题,但是您可以使用
$(this)
代替第一个函数作用域中的 this.map/this.each
。
问题是,在第二个代码中你所做的
if (array[i] > length)
而不是
if (array[i].length > length)
与 jQuery 插件无关!
这是未经测试的,但基本结构是这样的。当需要一个循环时,您的代码中也会有很多循环。
$.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>"
});
您已经有了一个可以工作的功能,只需使用它即可。
$.ellipsiText = ellipsiText;
$.fn.ellipsiText = function (count) {
ellipsiText(this, count);
}
现在您可以像以下任何一个一样使用它:
ellipsiText('.class',50);
$.ellipsiText('.class',50);
$('.class').ellipsiText(50);
当你可以使用已经可用的功能时,重写它是没有意义的。