Javascript 我怎样才能使这个jQuery;“收缩文本”;功能更有效?用二进制搜索?
我构建了jQuery函数,该函数将文本字符串和宽度作为输入,然后收缩该文本,直到其不大于宽度,如下所示:Javascript 我怎样才能使这个jQuery;“收缩文本”;功能更有效?用二进制搜索?,javascript,jquery,Javascript,Jquery,我构建了jQuery函数,该函数将文本字符串和宽度作为输入,然后收缩该文本,直到其不大于宽度,如下所示: function constrain(text, ideal_width){ var temp = $('.temp_item'); temp.html(text); var item_width = temp.width(); var ideal = parseInt(ideal_width); var smaller_text = text;
function constrain(text, ideal_width){
var temp = $('.temp_item');
temp.html(text);
var item_width = temp.width();
var ideal = parseInt(ideal_width);
var smaller_text = text;
var original = text.length;
while (item_width > ideal) {
smaller_text = smaller_text.substr(0, (smaller_text.length-1));
temp.html(smaller_text);
item_width = temp.width();
}
var final_length = smaller_text.length;
if (final_length != original) {
return (smaller_text + '…');
} else {
return text;
}
}
这很好,但是因为我在很多文本上调用这个函数,除了Safari 4和Chrome之外的任何浏览器上,它都非常慢
我曾尝试使用二进制搜索方法来提高效率,但到目前为止,我的浏览器中出现了一个缓慢的脚本对话框:
function constrain(text, ideal_width){
var temp = $('.temp_item');
temp.html(text);
var item_width = temp.width();
var ideal = parseInt(ideal_width);
var lower = 0;
var original = text.length;
var higher = text.length;
while (item_width != ideal) {
var mid = parseInt((lower + higher) / 2);
var smaller_text = text.substr(0, mid);
temp.html(smaller_text);
item_width = temp.width();
if (item_width > ideal) {
// make smaller to the mean of "lower" and this
higher = mid - 1;
} else {
// make larger to the mean of "higher" and this
lower = mid + 1;
}
}
var final_length = smaller_text.length;
if (final_length != original) {
return (smaller_text + '…');
} else {
return text;
}
}
有没有人知道我应该做些什么来尽可能提高这个功能的效率
谢谢!Simon脚本的问题可能是
而条件(item\u width!=理想)
可能永远不会中止循环。可能无法将输入文本修剪到精确的宽度ideal
。在这种情况下,函数将永远循环,这将触发慢速脚本对话框
为了避免这种情况,如果显示的文本足够小,就应该停止循环(也就是说,添加更多字符会使其太大)。我使用了2个div
<div class="englober">
<div class="title"></div>
</div>
你能描述一下你的目的吗?在我看来,将文本放在带有overflow:hidden的固定宽度块中会更容易。@Joel我之所以要这样做,是因为在溢出的文本中添加了省略号(…)。
while ($(".title").width() > $(".englober").width())
{
var dFontsize = parseFloat($(".title").css("font-size"), 10);
$(".title").css("font-size", dFontsize - 1);
}