次のように、forループに動的に生成されたアンカータグのセットがあります。
<div id = "solTitle"> <a href = "#" id = "' + tagId + '" onClick = "openSolution();"> ' + solTitle + '</a></div> <br>';
このコードが実行されると、いずれかのケースのHTML出力は次のようになります。
<div id = "solTitle"> <a href = "#" id = "solution0" onClick = "openSolution();">Solution0 </a></div> <br>
<div id = "solTitle"> <a href = "#" id = "solution1" onClick = "openSolution();">Solution1 </a></div> <br>
上記のリンクをクリックすると、さまざまなテキストが表示されるようになりました。 openSolution()は次のようになります。
function openSolution() {
alert('here');
$('#solTitle a').click(function(evt) {
evt.preventDefault();
alert('here in');
var divId = 'summary' + $(this).attr('id');
document.getElementById(divId).className = '';
});
}
実行していずれかのリンクをクリックしても、フローはjqueryクリックハンドラー内には入りません。上記のアラートを使用して確認しました。アラート-「ここ」のみを表示し、アラート-「ここ」を表示しません。リンクを2回クリックすると、すべてがdivIdの正しい値で完全に機能します。
初めてリンクをクリックすると、openSolution
関数が実行されます。その関数はclick
イベントハンドラーをリンクにバインドしますが、実行しません。リンクを2回クリックすると、click
イベントハンドラーが実行されます。
あなたがしていることは、そもそもjQueryを使用するという点を打ち負かしているようです。そもそもクリックイベントを要素にバインドするだけではどうでしょうか。
$(document).ready(function() {
$("#solTitle a").click(function() {
//Do stuff when clicked
});
});
この方法では、要素にonClick
属性を必要としません。
また、同じid
値(「solTitle」)を持つ複数の要素があるように見えますが、これは無効です。他の一般的な特性を見つける必要があります(通常、class
が適切なオプションです)。出現するid="solTitle"
をすべてclass="solTitle"
に変更すると、クラスセレクターを使用できます。
$(".solTitle a")
重複するid
値は無効であるため、同じid
の複数のコピーに直面すると、コードは期待どおりに機能しません。起こりやすいのは、そのid
を持つ要素の最初の出現が使用され、他のすべてが無視されることです。
Javascript関数を呼び出すonclickイベントでアンカータグを取得できます。
<a href="#" onClick="showDiv(1);">1</a>
今、javascriptで以下のコードを書きます
function showDiv(pageid)
{
alert(pageid);
}
これにより、「1」のアラートが表示されます。..
HTMLは次のようになります。
<div class="solTitle"> <a href="#" id="solution0">Solution0 </a></div>
<div class="solTitle"> <a href="#" id="solution1">Solution1 </a></div>
<div id="summary_solution0" style="display:none" class="summary">Summary solution0</div>
<div id="summary_solution1" style="display:none" class="summary">Summary solution1</div>
そして、javascript:
$(document).ready(function(){
$(".solTitle a").live('click',function(e){
var contentId = "summary_" + $(this).attr('id');
$(".summary").hide();
$("#" + contentId).show();
});
});
例を参照してください: http://jsfiddle.net/kmendes/4G9UF/
<div class = "solTitle"> <a href = "#" id = "solution0" onClick = "openSolution();">Solution0 </a></div> <br>
<div class= "solTitle"> <a href = "#" id = "solution1" onClick = "openSolution();">Solution1 </a></div> <br>
$(document).ready(function(){
$('.solTitle a').click(function(e) {
e.preventDefault();
alert('here in');
var divId = 'summary' +$(this).attr('id');
document.getElementById(divId).className = ''; /* or $('#'+divid).removeAttr('class'); */
});
});
私はいくつかのことを変更しました:
要素に対して同じIDを複数回使用することはできません。それはユニークであることを意図しています。
クラスを使用して、IDを一意にします。
<div class="solTitle" id="solTitle1"> <a href = "#" id = "solution0" onClick = "openSolution();">Solution0 </a></div>
クラスセレクターを使用します。
$('.solTitle a').click(function(evt) {
evt.preventDefault();
alert('here in');
var divId = 'summary' + this.id.substring(0, this.id.length-1);
document.getElementById(divId).className = '';
});
関数内でonclick
イベントを割り当てています。つまり、関数が1回実行されると、2番目のonclick
イベントも要素に割り当てられます。
関数
onclick
を割り当てるか、jqueryclick()
を使用します。
両方を持つ必要はありません