2013-04-19 5 views
7

奇妙な状況jQueryの機能をロードする方法:のみ文書仕上げ負荷後

私はjQueryCSSを使用してメニューバーを構築しています。私は、いくつかの理由...

function mark_active_menu() { 
    var elementWidth = $("nav li").width(); 
    alert(elementWidth); 
} 

$(document).ready(function(e) { 
    mark_active_menu(); 
} 

と前でもすべて文書仕上げロードを:私のJavaScriptファイルで
は、私がon-ready機能とても似ていアラートメッセージの幅が正しくない。私がメッセージをリリースしたときだけ、ドキュメントの残りの部分がロードされ、正しい幅が得られるはずです。

すべてのドキュメントが読み込まれる前に私の関数が呼び出されているのはなぜですか? 特定の要素のロードが完了した後にのみ関数をロードする方法はありますか(例:nav要素)?

+1

あなたはAJAXを使用して文書の一部をロードしていますか? –

+0

'$(window).on( 'resize'、fn)'や '$(window).on( 'load'、fn)'にフックできます。 –

+0

また、 'ready()'メソッドはeventObjectではなく、jQueryオブジェクト自体に渡されます。 –

答えて

11

window.loadを使用すると、すべてのリソースのロードが完了した後にトリガーされます。

$(window).load(function(e) { 
    mark_active_menu(); 
}); 

文書読み込み処理の終了時に負荷イベントが発生。この時点 では、文書内のすべてのオブジェクトはDOMであり、そしてすべての 画像とサブフレームはReference

+1

それは意味をなさない。セレクタは '$(" nav li ")' ...画像やフレームが表示されません...問題はAJAXがコンテンツを読み込むことです。 – Ian

+0

@lan私はコード内にAJAXを持っていますが、文書はロードされていませんが、ユーザーがそれをトリガーした後にのみ –

+0

@ Lior **ユーザーがそれをトリガーするまで**何もページに置かれないと、 $(document).ready'は適切なタイミングで実行されますか?とにかく、 '$(window).load'は同じ理由であなたの問題のために何の違いもないはずです – Ian

2

は窓試してみてください、確かに、読み込みが終了したload

$(window).load(function(e) { 
    mark_active_menu(); 
} 
+0

それは何の違いもありません - 問題はAJAXがコンテンツを読み込むことです。 – Ian

3

ウィンドウのloadイベントに試してみてください。

$(window).load(function() { 
    //Stuff here 
}); 
+0

これは違いはありません - 問題はAJAXがコンテンツを読み込むことです。 – Ian

5

現在のすべてのソリューションは、ちょうど主な問題の症状を治療しています。すべてのajaxがロードされた後にハンドラがを実行するようにしたい場合は、約束をすることができます。

var ajax1 = $.ajax(); 
var ajax2 = $.ajax(); 

jQuery(function($) { 
    $.when.apply($, [ajax1, ajax2]).done(function() { 
     // your code here 
    }); 
}); 
+0

他の答えはAJAXのものを考慮に入れません。 AJAXリクエストは、 'window.onload'が起動するまでに行われることもあれば、行われないこともあります。これは正解です。私はupvoteしたが、私はもう票が残っていない:( – Ian

+0

ありがとう、これは非常にうまくいく。実際にこれをさらに高速になるようにするにはどうすればよいですか?動的にロードされていたdiv内のテキストを置き換える必要があった、 、わずかな遅れがあります。 –

0

(時々、初めに絶対にロードされない、(後に数ミリ秒程度0-200ms))の前に:

$(document).ready(function(){ 
$('body').hide(0); 
}); 

後:では

$(window).load(function(){ 
$('body').delay(500).show(0); 
}); 
0

私AJAXとHTMLでの作業の状況。関数$(document).ready()と$(window).load()と同じ問題があります。私はこの問題を、HTML DOCで動作するはずのイベントのハンドラをAJAXのレギュレーションが終了した直後に実行されるjQuery関数に追加することで解決しました。これを読む:" jQuery.post()"(関数の3番目のパラメータ)。私のコードで

それは次のようになります。

var RequestRootFolderContent = function(){ 
    $.post(
     'PHP/IncludeFiles/FolderContent.inc.php', 
     function(data){ 
      $('[class~="folder-content"]').html(data); 

      //Here what you need 
      $('[class~="file"]').dblclick(function(){ 
       alert("Double click"); 
      }); 
     } 
    ) 
}