これはばかげているようですが、サーバー側の要求を伴わないjQueryを使用して非同期関数呼び出しを行う方法を見つけることができません。私は、多くのDOM要素を反復処理する遅い関数を持っています。この関数が実行されている間、ブラウザーをフリーズしないようにします。私は、スロー関数が呼び出される前に小さなインジケータを表示したいと思います。スロー関数が返ってきたら、そのインジケータを隠したいと思います。私は、次があります。 jQuery非同期関数呼び出し、AJAX要求なし
$('form#filter', parentNode).submit(function() {
var form = $(this);
indicator.show();
var textField = $('input#query', form);
var query = jQuery.trim(textField.val());
var re = new RegExp(query, "i");
slowFunctionCall(); // want this to happen asynchronously; all client-side
indicator.hide();
return false;
});
は現在、私は、フォームを送信し、インジケータが表示されていない、ブラウザがフリーズし、その後
slowFunctionCall
を終了します。
編集
:ブラウザを凍結しないもvar indicator = $('#tagFilter_loading', parentNode);
indicator.hide();
var spans = $('div#filterResults span', parentNode);
var textField = $('input#query', parentNode);
var timer = undefined, processor = undefined;
var i=0, limit=spans.length, busy=false;
var filterTags = function() {
i = 0;
if (processor) {
clearInterval(processor);
}
indicator.show();
processor = setInterval(function() {
if (!busy) {
busy = true;
var query = jQuery.trim(textField.val()).toLowerCase();
var span = $(spans[i]);
if ('' == query) {
span.show();
} else {
var tagName = span.attr('rel').toLowerCase();
if (tagName.indexOf(query) == -1) {
span.hide();
}
}
if (++i >= limit) {
clearInterval(processor);
indicator.hide();
}
busy = false;
}
}, 1);
};
textField.keyup(function() {
if (timer) {
clearTimeout(timer);
}
/* Only start filtering after the user has finished typing */
timer = setTimeout(filterTags, 2000);
});
textField.blur(filterTags);
このショーやインジケータを隠し、:は、私は、次の解決策を得るために、特に、Sitepoint linkをVivin's answerを使用しました。 DOM要素が動作しているときに隠されているのを見ることができます。これが私の目的です。
私はすべてのJSが1つのスレッドで動作すると思います。したがって、非同期に関数を実行することはできません。しかし、私はこれについて間違っているかもしれません:) – PeeHaa
あなたの機能を減速させているDOM要素にどのようにアクセスしているかによって、この部分をスピードアップすることができます。クラスや属性フィルタ(遅い)を使ってJQueryで要素にアクセスしていますか?関数は2回以上実行されていますが、あなたがインタラクトしている要素/ IDをキャッシュする方法はありますか?影響を受けるすべての要素が使用するCSSクラスを変更して、同じDOMアップデートを実行できますか? – tomfumb