$(document).readyコールバックは、具体的にいつ実行されるのですか?
質問
仮に
.click()
ハンドラをアンカー (
<a>
) タグを
$(document).ready
のコールバックで呼び出されます。このハンドラは、デフォルトのアクションをキャンセルします (
href
に続く) アクションをキャンセルし、警告を表示します。
私が知りたいのは、コールバックが正確にいつ実行されるかということと、ユーザーがアンカーをクリックしても(ドキュメントはブラウザに表示されています)、イベントがまだ添付されていないということはあり得るのか、ということです。
ここにアンカーを含む異なる HTML ページがありますが、スクリプトを含める順序が異なります。これらの間に違いがあるとすれば、それは何でしょうか。ブラウザによって動作が異なるのでしょうか?
ページ1です。
<html>
<head>
<title>Test 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
$('a').click(function() {
alert('overriding the default action');
return false;
});
});
</script>
</head>
<body>
<a href="http://www.google.com">Test</a>
</body>
</html>
ページ2です。
<html>
<head>
<title>Test 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
</head>
<body>
<a href="http://www.google.com">Test</a>
<script type="text/javascript">
$(function() {
$('a').click(function() {
alert('overriding the default action');
return false;
});
});
</script>
</body>
</html>
ページ3です。
<html>
<head>
<title>Test 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<a href="http://www.google.com">Test</a>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
$('a').click(function() {
alert('overriding the default action');
return false;
});
});
</script>
</body>
</html>
では、ユーザがリダイレクトされるのは
href
にリダイレクトされ、アラートが表示されないということはあり得るのでしょうか?私が提供したどの例でも起こりうることなのでしょうか?
私が必要とするのは、アンカーをクリックしたときに
click
イベントハンドラがアンカーにアタッチされていることを確認することです。空の
href
を提供し、javascriptでそれを徐々に強化することができることを知っていますが、これはより一般的な質問です。
HTMLはウェブサーバーによって素早く生成されますが、jqueryライブラリは遠くのサーバーから取得するのに時間がかかる場合、何が起こりますか?これは私のシナリオに影響を与えますか? DOM の読み込みと比較して、スクリプトの組み込みの順序はどうなりますか? これらは並行して行うことができますか?
どのように解決するのですか?
例3 は最も高い確率で は、ハンドラがまだアタッチされていない状態でユーザがリンクをクリックできる可能性が最も高くなります。jQuery ライブラリを読み込んでいるため の後に の後に jQuery ライブラリを読み込んでいるので、Google のサーバーが少し遅い場合(または DNS 検索に 1 秒ほどかかる場合)、またはユーザーのコンピュータが jQuery の処理に遅い場合、ユーザーがリンクをクリックしようとするとクリック ハンドラが添付されません。
この現象が発生する可能性がある別の状況は、非常に大きい、または読み込みが遅いページがあり、このリンクが一番上にある場合です。その場合、DOM の一部が表示されても、完全に準備ができていない可能性があります。このような問題に遭遇している場合。 最も安全なのは をすることです。
-
でjQueryを読み込む。
head
(例1または2) -
の直後にクリックイベントをアタッチする。
<a>
要素の直後に、DOMReady コールバック内ではなく、click イベントをアタッチします。このようにすると、すぐに呼び出され、ドキュメントの残りの部分を待つことはありません。
要素がレンダリングされると、DOMから取得することができ、その後jQueryはそれにアクセスすることができます。
<a href="http://www.google.com">Test</a>
<script type="text/javascript>
// No (document).ready is needed. The element is availible
$('a').click(function() {
alert('overriding the default action');
return false;
});
</script>
さらに は、user384915のコメントに基づいて、アクションが完全にJavaScriptに依存している場合、HTMLの一部としてレンダリングすることさえせず、jQueryが準備できた後に追加してください。
<script type="text/javascript">
jQuery(function($){
$("<a />", {
style: "cursor: pointer",
click: function() {
alert('overriding the default action');
return false;
},
text: "Test"
}).prependTo("body");
});
</script>
関連
-
[解決済み] jQueryを使用しない$(document).ready相当
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] window.onload vs $(document).ready()
-
[解決済み] $(document).ready()」に相当するjQuery以外の機能は何ですか?
-
[解決済み] jQuery $(document).ready と UpdatePanels?
-
[解決済み] [Solved] jQuery - 複数の $(document).ready ...?
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?