私はTwitter bootstrap=を使用してサイトを作成し、ツールチップを初期化しようとしていました。
$( "[rel = tooltip]")。tooltip()
!function($){ $(function(){ }) } (window.jQuery)
上記のコードは何をしますか?
コードを分割して説明しましょう
function () {
}()
またはしばしば
(function () {
})()
self-invoking anonymous
関数であり、Immediately-Invoked Function Expressions(IIFE)とも呼ばれます。匿名関数をすぐにインラインで実行します。
詳細については、 カプセル化された匿名関数の構文の説明 を参照してください。
匿名関数は強力な機能であり、スコープ(「変数名の間隔」)などの利点があります。 javascriptの自己実行関数の目的は? .
今、彼らは使用しています
function ($) {
}(window.jQuery)
とりあえず!
をスキップしましょう。
したがって、それらは引数としてwindow.jQuery
をその関数に渡し、$
として受け入れています。
これにより、$
がwindow.jQuery
(元のjQueryオブジェクト)のエイリアスになり、したがって、$
がそのclosure
内のjQuery object
を常に参照するようになります。他のライブラリが外部($
)を取得しても.
したがって、$
を使用してそのクロージャ内に記述したコードは常に機能します。
もう1つの利点は、$
が匿名関数の引数として提供されることです。これにより、scope chain
により近いため、グローバルな$
を使用した場合よりも、JSインタープリターがクロージャー内で$
オブジェクトを見つける時間が短くなります。
$(function(){
})
既にご存知かもしれませんが、jQueryのドキュメント準備ブロックです。これにより、dom is ready
のときにこの関数内のコードが実行され、すべてのevent binding's
が適切に動作します。
詳細は http://api.jquery.com/ready/ をご覧ください
そして、その!
が何をするのかはよく説明されています here または 関数の前に感嘆符は何をしますか?
略して:
!
の利点を示すために、ケースを考えてみましょう。
(function() {
alert('first');
}())
(function() {
alert('second');
}())
上記のコードをconsole
に貼り付けると、2つのアラートが表示されますが、このエラーが表示されます
TypeError: undefined is not a function
なぜこれが起こるのですか? JSエンジンが上記のコードブロックを実行する方法をシミュレートしましょう。この匿名関数を実行しますfunction() {alert('first');}()
はアラートを表示し、何も返さないので、()
内でundefined
が返されます。 2番目の関数でも同じことが起こります。したがって、このブロックの実行後、次のような結果になります
(undefined)(undefined)
また、構文はself-invoking anonymous
関数に似ているため、その関数を呼び出そうとしますが、最初の(undefined)
は関数ではありません。したがって、undefined is not a function
エラーが発生します。 !
はこの種類またはエラーを修正します。 !
で何が起こるか。上記の回答リンクの行を引用しています。
!を使用すると、関数は単項(論理)NOT演算子の単一オペランドになります。
これにより、関数が式として評価され、インラインですぐに呼び出されます。
これにより上記の問題が解決します。次のように!
を使用して上記のブロックを書き換えることができます。
!(function() {
alert('first');
}())
!(function() {
alert('second');
}())
あなたの場合は、このようなドキュメントの準備ができているブロック内にツールチップコードを置くことができます
$(function(){
$("[rel=tooltip]").tooltip();
});
そしてそれはうまく動作します。
doc ready block
なしで$("[rel=tooltip]").tooltip()
を使用する場合、このコードが実行される可能性があります。DOMにはrel=tooltip
を持つ要素はまだありません。したがって、$("[rel=tooltip]")
は空のセットを返し、tooltip
は機能しません。
doc ready block
なしでは機能しない場合のマークアップの例、
.
.
.
<script type="text/javascript">
$("[rel=tooltip]").tooltip();
</script>
.
.
.
.
<a href="#" rel="tooltip">Something</a>
<a href="#" rel="tooltip">Something</a>
<a href="#" rel="tooltip">Something</a>
ブラウザがマークアップを順番に解釈すると、それに直面するとすぐにjsコードを実行します。ここでJSブロックを実行するとき、JSブロックの後に表示されるように、a rel="tooltip"
タグはまだ解析されていません。したがって、それらはDOMにありません。
したがって、上記の場合、$("[rel=tooltip]")
は空であるため、ツールチップは機能しません。したがって、すべてのJSコードを次のようにdocument ready
ブロック内に置くことは常に安全です
$(function){
// put all your JS code here
});
これがすべてあなたに今理にかなっていることを望みなさい。