2012-01-29 4 views
0

私は、必要なときにのみコードを読み込むようにWebページのコードをコンパートメント化しようとしています。私は私のページの頭の部分に含まれている1つのjavascriptファイルを持っています。このページにはボタンがあり、これをクリックするとdivが前面に表示され、$ .getScriptを使用してdivが生成されます。新しく読み込まれたコンテンツは、2つの追加のdivと10個のボタンで構成されます。ただし、ボタンは機能しません。私のメインのHTMLページ、プライマリのjavascriptファイルまたは新しくロードされたファイルで$( '#element')。click()コードを置くかどうかは、動作しません。フォーマットが間違っているのですか、これは決してうまくいかないものですか?

$(document).ready(function() { 
     alert("Test"); /*  This works  */ 
     $('#slideButton1').click(function() { 
       alert("Testing");  /* This doesn't  */ 
     }); 
}); 

ボタンは、次のコードによって生成されます。

function addGalleryButtons() { 
     var sLabels = new Array("Aircraft","Avatars","BattleArmor","BattleMechs","Book Covers","Characters","Lego BattleTech","Maps","Naval Vessels","Vehicles"); 
     var leftIndent = 15; 
     for(var i=0; i<sLabels.length; i++) { 
       var slBtn = $(document.createElement('div')).attr('id','slideButton'+i); 
       slBtn.addClass('base shadowed rad3 gSlideButton'); 
       slBtn.html(sLabels[i]); 
       var slb = { 'left' : leftIndent+'px' , 'opacity' : '0.7' }; 
       slBtn.css(slb); 
       slBtn.attr('title','slideButton'+i); 
       slBtn.appendTo('#gallerySlider'); 
       leftIndent = leftIndent + $('#slideButton'+i).width() + 12; 
     } 
} 

答えて

1

あなたの問題はあなたが$('#slideButton1')にバインドするとき、それはDOMに存在しないということです。解決策は、onメソッドを使用して$('#gallerySlider')要素にバインドすることです。

$('#gallerySlider').on('click', 'div', function(e){ 
    console.log($(this), $(this).attr('id')); 
}); 

divにクラス名を付けてそのようにターゲットを設定することをお勧めします。

$('#gallerySlider').on('click', '.myClassName', function(e){ // etc 
+0

私が取りましたjsFiddleを簡単に見て、複数のjavascriptファイルを使用している場合は、設定方法について直感的に直感的ではありませんでした。.on()機能と試行錯誤の調査を行うと、マウスオーバー/マウスアウトのためのもので、10個のボタンのそれぞれを処理します。 $( '#galleryWindow')( 'mouseover'、 '#gallerySlider div'、function(){$(this)).stop 。アニメーション({opacity:1.0}、200);}); $( '#galleryWindow')。on( 'mouseout'、 '#gallerySlider div'、function(){$(this)。stop()。animate({opacity:0.5}、200); }); –

0

イベントが配線されていないのは、これらの要素がまだDOMにないためです。そのため、ボタンが機能しないのです。私は助けることはできませんが、あなたが本当に探しているものは、オンデマンドでスクリプトを読み込む方法だと考えています。私は個人的にrequire.jsをお勧めします。これは、あなたがしようとしていることを正確に行うJavaScriptモジュールローダーです。かなり簡単です。 Get started here.プッシュが必要な場合は私にメールしてください。

2

まず、jsFiddleを提供できると幸いです。これらの2つの関数が呼び出される順序に関する情報は提供しません。

しかし、私はできればこれをコメントに書きましたが、私の評判が十分でないため、私はできません。だからここであなたのソリューションへのアプローチを試みます。

アンラインczarchaic、私はonを使用しません。私はliveメソッドを使用します。追加情報、パラメータリスト、および例については、documentationを参照してください。しかし、これにはいくつかの欠点があります。 liveメソッドがかなりのパフォーマンスを食べるので、この方法論は嫌です。イベントのチェックが必要な要素を制限するため、デリゲートが優先されます。 thisのような記事を考えてみましょう。私が読んだ記事は覚えていませんが、情報はかなり似ていると思います。

+1

@ czarchaicの方法は優れています。 'live'は推奨されず、正当な理由があります。 '$(document).on(etc)'(これはちょうど 'live')を使って同じ効果を再現できます。ただし、これはドキュメント内のすべての要素がリスナーであることを意味します。最も近い*破壊されていない*祖先だけを聞き手にしてみませんか?それはより良い行い、それが重要な人たちのために(誰も認めるわけではありません!)、それはよりエレガントです。 –

+0

@GregPettit jQueryを扱って以来、しばらくお待ちしています。私の現在のプロジェクトで私の現在の段階はJavaScriptを必要としません。私は 'on'メソッドをまだ使用していません。私は「私はライブメソッドを使う」と認めました。もし私ができるなら、私はコメントとして私の答えの4分の1を掲示していただろうが、よく...私は50名未満です。それは本当にStackOverflowについて私を悩ますものです...とにかく、あなたのコメントのおかげで。私は最終的にJSを必要とするフェーズに進むと、それをチェックインします。 :D – Kiruse

0

返されたjavascriptによって呼び出される関数にイベントハンドラを配置すると、うまくいくはずです。 機能()addHandlers {$( '#slideButton1')をクリックします(関数(){}

その後、あなた返されたJavaScriptの終わりに:。。 addHandlers();これは非常によく働いた

関連する問題