Я использую функцию jQuery ниже с именем textfill
на сотнях div. В основном это изменяет размер внутреннего текста, чтобы он соответствовал охватывающему div таким образом, чтобы размер шрифта текста был максимальным, поэтому более длинные тексты меньше, чем короткие, но имеют максимальный размер шрифта, который они могут быть без переполнения из div.jQuery script efficiency
; (function($) {
/**
* Resizes an inner element's font so that the inner element completely fills the outer element.
* @version 0.1
* @param {Object} Options which are maxFontPixels (default=40), innerTag (default='span')
* @return All outer elements processed
* @example <div class='mybigdiv filltext'><span>My Text To Resize</span></div>
*/
$.fn.textfill = function(options) {
var defaults = {
maxFontPixels: 40,
innerTag: 'span'
};
var Opts = jQuery.extend(defaults, options);
return this.each(function() {
var fontSize = Opts.maxFontPixels;
var ourText = $(Opts.innerTag + ':visible:first', this);
var maxHeight = $(this).height();
var maxWidth = $(this).width();
var textHeight;
var textWidth;
do {
ourText.css('font-size', fontSize);
textHeight = ourText.height();
textWidth = ourText.width();
fontSize = fontSize - 1;
} while ((textHeight > maxHeight || textWidth > maxWidth) && fontSize > 3);
var pos = (maxHeight-textHeight)/2;
ourText.css('top', pos +'px');
});
};
})(jQuery);
Потому что я запускаю этот скрипт на сотни дивы, которые выглядят как:
<div class="textDiv"><span>text appears here</span></div>
В то же время с помощью:
$('.textDiv').each(function() { $(this).textfill({ maxFontPixels: 28 })});
Это занимает от 40 до 70 секунд в зависимости от количества из divs. Мне отчаянно нужно настроить код, чтобы он работал быстрее. Я пробовал последние два часа, но не могу заставить его работать быстрее. Может кто-нибудь помочь?
EDIT:
Взял некоторый вклад от комментариев и изменил код:
var items = document.getElementsByClassName("textDiv");
for (var i = items.length; i--;) {
$(items[i]).textfill({ maxFontPixels: 28 });
}
Это, кажется, немного быстрее, но по-прежнему очень медленно.
То, что вы пытаетесь, является дорогостоящей операцией. Но я помню, как однажды читал (извините, нет источника), что «каждая» функция довольно неэффективна. Вы пробовали использовать обычный цикл javascript for? – Ruben
Другое дело, что я пытался использовать '$ ('. TextDiv'). Textfill ({maxFontPixels: 28});', но я думаю, что это неявный вызов 'each' – Tom
Tom, что пример в вашем комментарии будет более эффективным. В вашем плагине 'textfill()' это _explicit_ вызов '.each()' независимо от того, какой объект jQuery вы проходите, но способ комментария не позволяет настраивать значения по умолчанию повторно в плагине. '.each()' в плагине можно ускорить, переведя в стандартный цикл 'for', как предложил Рубен. – nnnnnn