我正在尝试创建一个 jQuery 函数,它将一个字符串和固定宽度作为输入,然后通过二进制搜索方法(为了提高效率)“收缩”那段文本,使其不超过固定宽度。
这是我目前所拥有的:
function constrain(text, ideal_width){
var temp = $('.temp_item');
temp.html(text);
var item_width = temp.width();
var ideal = parseInt(ideal_width);
var text_len_lower = 0;
var smaller_text = text;
var text_len_higher = text.length;
while (true) {
if (item_width > ideal) {
// make smaller to the mean of "lower" and this
text_len_higher = smaller_text.length;
smaller_text = text.substr(0, ((text_len_higher + text_len_lower)/2));
} else {
if (smaller_text.length >= text_len_higher) break;
// make larger to the mean of "higher" and this
text_len_lower = smaller_text.length;
smaller_text = text.substr(0, ((smaller_text.length + text_len_higher)/2));
}
temp.html(smaller_text);
item_width = temp.width();
}
var new_text = smaller_text + '…'
return new_text;
}
不幸的是,这会导致在我的浏览器中永远无法完成的“慢脚本”。 Firebug 指出 jquery.js(版本 1.3.2)的第 1131 行是罪魁祸首,它是“独特”的 jQuery 实用程序。然而,我没有在任何地方使用“独特”。
我在这里做错了什么?
最佳答案
你能连接一个 javascript 调试器并检查它崩溃的地方吗?将 Firebug 与 Firefox 一起使用,或将 MSVS 与 IE 一起使用。如果它爆炸得太厉害以至于调试器死了,请单步执行该函数,看看它能走多远。
根据最后的评论更新:我认为您需要单步执行您的代码,看看它能走多远。我会怀疑一些事情:
可能对象的宽度在设置新的内部文本后还没有重新计算(或者已经无效)。可能是更新后的宽度直到稍后 UI 重新调整时才可用。
理论上这个循环应该总是终止,但它有可能(特别是如果浏览器没有正确地重新计算宽度)循环可能会永远持续下去。
您可能在拆分内部文本时拆分了 HTML 标记,导致您的代码插入格式错误的 HTML,可能导致页面布局中断。
关于javascript - 如何制作一个使用二进制搜索方法收缩字符串的 jQuery 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/917679/