2011-02-07 1 views
1

ページの内容を更新するいくつかのライブクエリハンドラがあります。私はコンテンツが表示されるのは、(ユーザーが変更されていないバージョンをしばらく見ているのを防ぐためです)発射した後でなければなりません。コンテンツは通常のAJAXを使用して読み込まれます。jqueryの後に何かを実行すると、DOM(AJAXリクエスト)が更新されます

これまでのところ、私は次のことを試してみました:

  1. HTML
  2. 経由アヤックスはそれが見えない(可視性:隠された)を作る取得
  3. window.setTimeoutは(showContent、100) - 見え
  4. にセットの可視性

1つのタブに1つのJSスレッドがあるので、これはうまくいくと思われます。そのため、タイマーは他のすべての操作が完了した後に起動する必要があります。それはFF & IEで動作します。しかし、Chromeでは、しばらくの間、変更されていないコンテンツが表示されていることがあります.JSがスレッド化されたか、タイムアウトによって中断されたかのようです。

私がやろうとしていることを達成するためのより良い方法がありますか? (タイムアウトなし)。

+0

なぜあなたが最初のリクエストを更新しますか?要求自体からすべての適切なデータを呼び出す方がよいでしょうか? – yoda

+0

最初は適切なものを生成する方が良いでしょうが、アップデートの一部はレイアウトに依存します。たとえば、実際のテキストの幅(省略記号)を考慮してください。 – adamw

答えて

1
  • あなたはsuccessコールバック
  • を使用するか、バックjavascriptを自分自身を返し、DOMに追加することができます。 (ディスプレイメカニズムを指定する:))
+0

しかし、成功したコールバックで新しいコンテンツを受け取り、DOMを更新しているので、すべてのlivequery/jqueryイベントは、呼び出しが完了した後にのみ発生します。 – adamw

+0

setTimeoutの代わりに、コールチェーンの最後に.show()コールを起動することもできます。とにかくjsはシングルスレッドになります。つまり、フローは次のようになります - >あなたはajaxを呼び出します - >成功はhide() - > hide()のコールバックがあなたの更新関数を呼び出します - >更新関数呼び出し.show()..それは働いていないのですか? – Shrinath

+0

残念ながら、livequeryイベントは、メソッドが終了した後でのみ発生します。私はまた、流れがこのようになると思っていましたが、何らかの理由で(時にはFFで、Chromeでは、決してIEではありません)、タイムアウトはlivequeryイベントの前に呼び出されます。 – adamw

0

livequeryは内部的にタイムアウトを使用しているため、ライブクエリを実行しているので、タイムアウトメソッドの順序が問題になりました。

(ユーザがマウスで狂っていると常にイベントを生成する場合、いくつかの境界に)livequeryキューがクリアされるまで、だから私は、この待機を解決:

function run_after_livequery(method) { 
    var tries = 0; 
    function run_if_livequery_done() { 
     if (!$.livequery.queue.length || tries >= 20) { 
      method(); 
     } else { 
      window.setTimeout(run_if_livequery_done, 50); 
      tries++; 
     } 
    } 

    window.setTimeout(run_if_livequery_done, 50); 
}