dポイントプレゼントキャンペーン実施中!

HTMLの書き方について質問です。

tableのtdにonclick処理を設定し、
さらに、そのtd内の文字列にもonclick処理を設定したいのですが、
文字列をクリックしたときに、同時にtdに設定したonclick処理も実行されてしまいます。

文字列をクリックしたときは、その文字列に設定してある処理だけ実行するようにはできないのでしょうか?

具体的なサンプルは下記の通りで、
text_funcだけを実行させたいのです。

----------------------
<html>

<head>

<script language="JavaScript" type="text/javascript">
<!--
function td_func(){
折りたたまれている文字を表示する処理;
}

function text_func(){
TD(セル?)の背景色を変える処理;
}
//-->
</script>

</head>

<body>

<table border="1">
<tr>
<td style="padding:10px;" onclick="td_func()">
<a href="#" onClick="text_func();return false;">test_td</a>
</td>
</tr>
</table>

</body>
</html>

A 回答 (3件)

直接回答ではありませんが



JavaScript イベントバブリング あたりの検索ワードが役に立つと思います。

この回答への補足

返信が遅くなりまことに申し訳ありません。

お教えいただいた単語からいろいろと調べることができました。
全く知識がない単語だっただけにとても助かり、勉強になりました。

ありがとうございました。

補足日時:2014/04/09 09:35
    • good
    • 0
この回答へのお礼

早々のご回答ありがとうございます。
お教えいただいた内容で調べてみます。

お礼日時:2014/03/06 13:36

addEventListener と stopPropagation を使いましょう


https://developer.mozilla.org/ja/docs/Web/API/ev …
例:
addEventListener('load', function(ev){
_ function listener(clickEvent) {
_ _ clickEvent.stopPropagation(); // 上位要素への伝播を止める
_ _ clickEvent.preventDefault(); // ブラウザのデフォルト挙動(ページ遷移)を防ぐ
_ _ 処理(clickEvent.currentTarget);
_ }
_ document.getElementById(対象のリンクID).addEventListener('click', listener, false);
}, false);

古いIEを考慮しなければならない特別な事情があるなら cancelBubble を併用してください
http://msdn.microsoft.com/ja-jp/library/cc409795 …
例:
function text_func(){
_ window.event.cancelBubble = true; // 上位要素への伝播を止める
_ 処理();
}
    • good
    • 0
この回答へのお礼

返事が遅くなり申し訳ありません。
ご回答ありがとうございます。

有益な情報をいただき感謝いたします。
私の記述が悪いためだとは思いますが、なぜかcancelBubble しか効きませんでした。
初心者のため、イベントバブリングを考慮し始めると深みにはまってしまいそうだったので、
チェックボックスのON・OFFで処理を切り替えることにしました。

お手数おかけしましたが、いろいろと勉強になりました。
ありがとうございます。

お礼日時:2014/04/09 09:44

こんな感じでどうでしょ?


・クリックに反応するTDにfuncTDクラスを設定
・クリックに反応するAにfuncAクラスを設定

<html>
<head>
<script>
try{
document.addEventListener ('click',function(e){clickfunc(e)},true); //基本
}catch(e){
document.attachEvent('onclick',function(e){clickfunc(e)}); //IE
}
function clickfunc(e){
var t = (e.srcElement || e.target);
if(t.nodeName=="A" && t.className.match(/(^| )funcA( |$)/)){
text_func();
if(e.preventDefault)e.preventDefault(); //基本
else e.returnValue = false; //IE
}else if(t.nodeName=="TD" && t.className.match(/(^| )funcTD( |$)/)){
td_func();
}
}

function td_func(){
alert("tdおした");
}

function text_func(){
alert("aおした");
}
</script>
</head>
<body>
<table border="1" >
<tr>
<td class="funcTD">
<a href="#" class="funcA">td:funcあり、a:funcあり</a> 地雷
</td>
<td>
<a href="#" class="funcA">td:funcなし、a:funcあり</a> 安全地帯
</td>
</tr>
<tr>
<td class="funcTD">
<a href="#">td:funcあり、a:funcなし</a> 地雷
</td>
<td>
<a href="#">td:funcなし、a:funcなし</a> 安全地帯
</td>
</tr>
<tr>
<td class="funcTD">
td:funcあり、a:なし 地雷
</td>
<td>
td:funcなし、a:なし 安全地帯
</td>
</tr>
</table>

</body>
</html>
    • good
    • 0
この回答へのお礼

返事が遅くなり申し訳ありません。
ご回答ありがとうございます。

スタイルを変える処理も追加したかったので、
結局、チェックボックスを用意してチェック時にだけ処理を実行するようにしました。

お礼日時:2014/04/09 09:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!