javascript(jquery)脚本的性能是同步的还是异步的
javascript (jquery) script perfomance synchronous vs asynchronous
我有一个javascript函数,可以根据输入文本的变化过滤dom元素,所以:
$(".input").keyup(function(e) {
filter();
});
var cache = $(".dom");
var filter = function() {
cache.each(function() {
// if field contains some text show else hide
}
};
我的问题发生在有许多dom元素要筛选时,由于同步处理(如上面的示例),整个页面都无法访问。我正试图想出一个解决方案,它不会用同步处理锁定整个页面。
这个问题与过滤器逻辑无关(完全是琐碎的),与jquery或javascript itslef无关,与同步处理和dom元素的数量有关
由于JavaScript是单线程的,唯一真正的解决方法是将长时间运行的作业拆分为一系列较短的作业,并在每个部分的末尾使用具有短时间延迟的setTimeout()来启动下一个作业。这为您的UI和其他JavaScript事件提供了更新的机会。
您可以通过将大型dom节点放在队列中来更新它们,并且在每个setTimeout"tick"上只处理少数元素。在伪代码中:
on(event):
queue = DOM nodes to be updated
setTimeout(update)
update:
queue.slice(0, limit).each(...update a node...)
queue = queue.slice(limit) // remove processed nodes
if (queue.length > 0) setTimeout(update) // repeat...
请参阅http://jsfiddle.net/Etsmm/2/以获得完整的工作示例。
更新:第一个版本的Chrome出现了问题(与"显示"错误有关),根据这个答案添加修复程序似乎已经成功了。
或者在其他地方通过ajax请求进行操作(如果真的太长的话)?也许,还有某种:第一步,选择要隐藏在数组中的所有ID,然后,设置时间,然后在第二步,像50/50一样隐藏它们?此外,也许处理将所有这些元素的容器隐藏起来,然后一旦完成,重新格式化可能会更快?
出于这种目的,我通常更喜欢Ben Alman的消息队列库。它也有不同的选择。这个在节流方面相当成功。
https://github.com/cowboy/jquery-message-queuing/
下面是节流样品
http://benalman.com/code/projects/jquery-message-queuing/examples/throttling/
感谢大家的帮助。我根据Ben Clayton的回应提出了一个解决方案,但我仍在寻找想法并研究thg435解决方案。任何评论都将被删除。
<script type="text/javascript">
$(document).ready(function () {
var cache = $(".whatever");
var wait = 0;
var input = $("#input");
var regex = null;
input.keyup(function (e) {
go.index = 0;
clearTimeout(wait);
wait = setTimeout(go.start, 500);
});
var filter = function (i) {
var one = cache.eq(i - 1);
one.text().match(regex) ? one.show() : one.hide();
go.index++;
setTimeout(go.filter, 10);
};
go = {
index: 0,
filter: function () {
go.index == 0 || go.index > cache.length ? null : filter(go.index);
},
start: function () {
go.index = 1;
var search = input.val();
search = search.replace(new RegExp("[a]", "gi"), "[aàáâã]");
search = search.replace(new RegExp("[e]", "gi"), "[eéê]");
search = search.replace(new RegExp("[i]", "gi"), "[ií]");
search = search.replace(new RegExp("[o]", "gi"), "[oóô]");
search = search.replace(new RegExp("[u]", "gi"), "[uú]");
search = search.replace(new RegExp("[c]", "gi"), "[cç]");
regex = new RegExp(search, "gi");
go.filter();
}
}
});
</script>
<input type="text" id="input" />
<span class="whatever">lalala</span>
<span class="whatever">leléLÉ</span>
<span class="whatever">lololo</span>
<span class="whatever">lululu</span>
- 异步获取数据使用JavaScript同步获取数据
- javascript函数中的异步与同步.(Node.js)
- strongloop script.js run find in before delete方法:如何同步运行异步方法
- 如何模拟同步ajax调用?(基于异步的同步)
- 为什么同步睡眠功能没有被承诺内异步化
- 如何在异步函数与Deferredjquery之间同步
- 使用模态库从嵌套的异步调用中生成javascript同步代码
- 将数据发布到iframe是同步还是异步
- 节点.js / 续集.js / 快递.js - 如何插入多对多关联?(同步/异步?
- NodeJS中的异步与同步
- javascript如何成为一种同步语言并在浏览器和node.js环境中异步运行
- 如何同步2个异步瀑布
- 异步函数调用是否可以在两个同步语句之间完成
- 同步异步创建的承诺
- 同步/异步AJAX函数的模式
- 如何在 javascript 中同步异步方法
- 设置同步/异步函数序列的正确方法,所有这些函数都可以停止表单提交和进一步处理
- 浏览器呈现和javascript执行的同步/异步特性
- javascript中异步回调的结构:同步异步
- jQuery按顺序同步异步请求