LoginSignup
11
11

More than 5 years have passed since last update.

【Javascript】特定のid付きのdiv要素をクリックして特定の関数を実行させる

Last updated at Posted at 2014-07-29


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>特定のid付きのdiv要素をクリックして特定の関数を実行させる</title>
<style type="text/css">
</style>

</head>
<body>

<h2>特定のid付きのdiv要素をクリックして特定の関数を実行させる</h2>

<div id="a01">ここをクリック1</div>
<br/><br/>
<div id="a02">ここをクリック2</div>
<br/><br/>
<div id="a03">ここをクリック3</div>
<br/><br/>
<div id="a04">ここをクリック4</div>
<br/><br/>
<div id="a05">ここをクリック5</div>
<br/><br/>
<div id="a06">ここをクリック6</div>
<br/><br/>
<div id="a07">ここをクリック7</div>
<br/><br/>
<div id="a08">ここをクリック8</div>

<h3>注意</h3>
同じidに関数を設定するときは、引数flgをtrueにして渡す。<br/><br/>
<div id="a09">ここをクリック9</div>
<br/><br/>
同じidに関数を設定するときに引数flgがなかったり、<br/>
flgがfalseになっていると関数が上書きされる。<br/><br/>
<div id="a10">ここをクリック10</div>
<br/><br/>


<script type="text/javascript">

function getElementID(nm){
  return document.getElementById(nm);
}

var click=click||{};

click.click_id=(function(){

    var that={};

    that.fire=function(s){

      var id=s.id,bullet=s.bullet,para=s.para,flg=s.flg,
          targetElement=getElementID(id),
          clickListener=function(){
              bullet(para);
          };

          if(!flg){

              //クリックイベント1つ目を登録
              targetElement.onclick=clickListener;

          }else{

              //クリックイベント2つ目以降を登録
              if(targetElement.addEventListener){
                  targetElement.addEventListener('click',clickListener,false);
              }else{
                  targetElement.attachEvent('onclick',clickListener);
              }

          }

    };

    return that;

})();

function click01(para){
var str=para||"hello";
 alert(str);
}

function click02(para){
 var str;
 if(para&&para.name){
  str=para.name;
 }else{
  str="小保方";
 }
 alert(str);
}

window.onload=function(){

click.click_id.fire({id:"a01", bullet:click01});
click.click_id.fire({id:"a02", bullet:click01,para:"焼肉"});
click.click_id.fire({id:"a03", bullet:click01,para:"親子丼"});
click.click_id.fire({id:"a04", bullet:click01,para:"映画"});
click.click_id.fire({id:"a05", bullet:click01,para:"Game Over"});
click.click_id.fire({id:"a06", bullet:click02});
click.click_id.fire({id:"a07", bullet:click02,para:{name:"John"}});
click.click_id.fire({id:"a08", bullet:click02,para:{name:"God"}});

//同じidに関数を設定するときは、引数flgをtrueにして渡す
click.click_id.fire({id:"a09", bullet:click01});
click.click_id.fire({id:"a09", bullet:click01,para:"hello world 2014",flg:true});

//上書きされて、"hello"でなく、"hello world 2014"がアラートされる
click.click_id.fire({id:"a10", bullet:click01});
click.click_id.fire({id:"a10", bullet:click01,para:"hello world 2014"});

}

</script>
</body>
</html>

解説

同じidで2つ以上の関数が登録できない仕様から、@sounisi5011さんの指摘を受けて、改変して、同じidで2つ以上の関数が登録できる仕様に変更した。

1つのクリックイベントを登録するときと、復数のクリックイベントを登録するときで処理を分岐させた。
クリックイベントって同じidに復数の関数登録するときってあんまりないし、あるならそれを明示的にやるほうが、読みやすいコードになるはず。

よって、パラメータflgをtrueにすると同じidにクリックイベントを登録し、パラメータflgがないときは1つのクリックイベントを登録すると明示する仕様とした。

追記

@sounisi5011さんの指摘通りgetElementID(id)を格納する変数clickListenerを作ってclick.id_base関数を更に改善した。

追記2

click.id_baseからclick.click_idに名前を変更した

関連

【Javascript】特定のid付きのp要素をクリックする度にアラートする数字が増加(0にリセット可)

11
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11