2017-02-28 9 views
2

誰かが私にハンドラを別に追加できない理由を教えてもらえますか?代わりに、私はそれを動作させるために以下のようなことをしなければなりませんか?jQueryにイベントを追加する

私の質問は、$(document).ready()内の段落を隠すためのコードを追加して、動作させる理由です。

<!DOCTYPE html> 
<html> 
<head> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
<script> 
$(document).ready(function(){ 
    alert('test'); 
}); 
</script> 
<script> 
$("p").click(function(){ 
     $(this).hide(); 
    }); 
    </script> 
</head> 
<body> 

<p>If you click on me, I will disappear.</p> 
<p>Click me away!</p> 
<p>Click me too!</p> 

</body> 
</html> 

作業は

<!DOCTYPE html> 
<html> 
<head> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
<script> 
$(document).ready(function(){ 
    $("p").click(function(){ 
     $(this).hide(); 
    }); 
}); 
</script> 
</head> 
<body> 

<p>If you click on me, I will disappear.</p> 
<p>Click me away!</p> 
<p>Click me too!</p> 

</body> 
</html> 
+0

DOMが最初のコードでは –

+1

でロードされていないからだとかなり確信してあなたのクリックイベントが定義されていないスニペットdocument.ready function – Maharshi

+2

別のオプションがあります:JSを本体の最後に置いて、参照しようとする要素の後ろに置いてください。 – nnnnnn

答えて

3

最初のスニペットの問題は、ドキュメントがロードされる前にjQueryコードが登録されているため、HTML要素を認識しないためです。したがって、それは動作しません。

ソリューション: -

1.Eitherは(最初の1の場合)は、ページの一番下にあなたのコードを置きます。

2.既に2番目のコードで行ったコードを($(document).ready(function(){..});)にラップしてください。上記の両方の例のHTML要素で

が正しくロードされ、お使いのjQueryコードの前に登録されたので、あなたのコードは

1

次のように変更し、それをコード - ..

$(document).ready(function(){ 
 
    alert('test'); 
 
    $("p").click(function(){ 
 
     $(this).hide(); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
<p>If you click on me, I will disappear.</p> 
 
<p>Click me away!</p> 
 
<p>Click me too!</p>

+0

OPが*すでに2番目の例で*行っていることではありませんか?彼らは最初の方法が失敗し、2番目の方法が機能する理由を尋ねています。 – nnnnnn

+0

私は彼にコードを渡した。開発者はその違いを理解することができます。 – Maharshi

+0

* "私の質問は、$(document).ready()内の段落を隠すコードを追加して、それを動作させる理由です。" * - あなたは質問とあなたが表示したコード彼はすでに働いていたとOPが言ったのと同じように見えますが、警告が加えられました。 – nnnnnn

1

$(documet).ready(function(){})は関係なく、場所のページで解析されたすべてのDOM elements後に実行されます。準備ができていないコードを書くと、コードは順番に実行されます。 javascriptコードがDOM要素の外観の前に配置されていれば、動作しません。あなたは(1ケース)を配置した場合 -

<script> 
$("p").click(function(){ 
    $(this).hide(); 
}); 
</script> 

ただ、bodyタグの前に予想通り、それは動作します - ページに解析されたすべてのDOM要素が$(documet).ready(function(){})を利用して確認します。

+0

これは動作しますか? –

1

イベントハンドラのみ、現在選択された要素にバインドされている作業を開始しますされています。あなたのコードが「クリック」ハンドラを呼び出すときにそれらが存在していなければなりません。

次の方法でそれを実現することができます。

  1. は常にベストプラクティスであるHTMLの本文の最後にスクリプトが含まれています。

  2. (()またはbody.onloadの機能にあなたの処理コードをラップし、document.readyの内側にその関数を呼び出す)。 document.ready()は、画像のようなリソースを待たずに、HTMLコンテンツがロードされた直後にイベントをアタッチするため、優先されます。

  3. イベントハンドラを添付するには、イベントを委任してください。イベントを使用してください。委任されたイベントには、後でドキュメントに追加される子孫要素のイベントを処理できるという利点があります。

このように私はそれを行うだろう:

(function(){ 
 
    $('p').on('click',function(){ 
 
    $(this).hide(); 
 
    }); 
 
})();
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
<script> 
 
$(document).ready(function(){ 
 
    alert('test'); 
 
}); 
 
</script> 
 
</head> 
 
<body> 
 

 
<p>If you click on me, I will disappear.</p> 
 
<p>Click me away!</p> 
 
<p>Click me too!</p> 
 

 
<script src=""></script> 
 
</body> 
 
</html>

関連する問題