2011-08-01 6 views
1

私は、このような状況を理解することはできません。JavaScriptとDOM

私はサイトのテンプレートを持っており、ヘッダにコードがある:

$(document).ready(function() { 
    $('#header').corner(); 
    ... 
} 

corner()はちょうどjQueryの - プラグイン関数です。しかし、問題は次のとおりです。

("#header") is null 
    $('#header').corner(); 

メインページでは動作しますが、別のテンプレートでは動作しません。

すべてのアクションを表示するには、thisページをご覧ください。ヘッダー(青色の上部div)が丸く表示され、Firebugコンソールにエラーはありません。今度はthisページに行きます。すべてがうまくいきますが、今回はメインページではありません(同じテンプレートファイルを使用しています)。

third pageの場合、エラーは同じテンプレートで表示されますが、どうしましたか?

答えて

7

問題は$ is a stupid name a for a functionです。

第3ページの$はjQueryで定義され、Prototypeによって再定義されています。あなたは葛藤しています。

$の代わりにjQueryを使用し、noConflictを使用するように、すべてのjQueryの内容を書き直します。

+1

jQueryの内容を書き換えないでください。 jQueryまたはPrototypeを使用することに決めました。 2つの異なるDOMライブラリを使用することは、単に愚かです。 – Raynos

+0

いいキャッチバディ。 –

1

クレンチェンの名前の競合を避けるために、スクリプトの名前空間をこのように使用するのがよい解決策です。

あなたはまだ、次の操作を実行して$を使用することができます。

(function($) { 
    //your code goes here and can use $ as jQuery without interfering with Prototype 
} (jQuery)); 

あなたが選択的に$を使用することができながら、直接$を使用する必要はありません。この道を。

1

あなたconsoleに入力した場合:

$.toString(); 

あなたは、いくつかのスクリプトは、どこかのjQueryのショートカット$を上書きすることがわかります。そのエラーの可能性が最も高いです。それを解決するために、あなたの全体のコードのラッパーコンテキストを作成します。$シンボルが、今、その関数のコンテキスト内で、jQueryオブジェクトを参照することを保証します

(function($) { 
    $(document).ready() { 
     $('#header').... 
    }); 
}(jQuery)); 

を。

+0

これをより簡潔に書く方法があります。 [私の答え](http://stackoverflow.com/questions/6897742/javascript-and-dom/6897965#6897965) – Eric

+0

を参照してください@エリック:私はちょうど1人の意見ですね。 – jAndy

0

前述のとおり、Prototypeとの名前の衝突があります。これを修正する最も簡単な方法は次のとおりです。

jQuery(function($) { 
    $('#header').corner(); 
    ... 
});