アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下実行すると、AAAをクリックしてもBBBをクリックしても「BBB」とアラートされます。

<html>
<head>
<script type="text/javascript" src="prototype.js"></script>
</head>
<body>
<script type="text/javascript"><!--
var gDown= false;

var div = document.createElement('div');
div.id = 'AAA';
div.innerHTML = 'AAA';
document.body.appendChild(div);

Event.observe(div, 'mousedown',function(){
gDown = div;
});

var div = document.createElement('div');
div.id = 'BBB';
div.innerHTML = 'BBB';
document.body.appendChild(div);

Event.observe(div, 'mousedown',function(){
gDown = div;
});

Event.observe(document, 'mouseup',function(){
alert(gDown.id);
gDown=false;
});
//--></script>
</body>
</html>

javascriptって値渡しだと思っていたので、期待した動作と異なります。参照渡しだと考えると納得できるのですが、javascriptって
参照渡し?それとも値渡し? と混乱しています。

この辺のところを、教えてください。お願いいたします。

A 回答 (4件)

連投失礼。


ついでなのでEvent.elementを使った実例。

<html>
<head>
<script type="text/javascript" src="prototype.js"></script>
</head>
<body>
<script type="text/javascript"><!--
var gDown = false;
var Ary = ['AAA','BBB'];
for(var i=0;Ary[i];i++){
var div = document.createElement('div');
div.id = Ary[i];
div.innerHTML = Ary[i];
document.body.appendChild(div);
Event.observe(div, 'mousedown',function(event){
gDown = Event.element(event); // ← ※ココ
});
}

Event.observe(document, 'mouseup',function(){
alert(gDown.id);
gDown=false;
});
//--></script>
</body>
</html>
    • good
    • 0

>使い捨てられていく変数を多数用意する


ちょっとおっしゃりたい事を理解してませんので見当違いかもしれませんが、

とりあえずサンプルのようなコードなら「値」を設定するのではなく、「イベント」オブジェクトからイベント発生オブジェクトを得るのが常套手段だと思います。

イベントオブジェクトはブラウザによって違いがあってやや面倒です。
http://wiki.bit-hive.com/tomizoo/pg/JavaScript%2 …

ただ、prototype.jsを使っているなら、Event.elemntでシンプルに取得できます。
http://www.s2factory.co.jp/tech/prototype/protot …
    • good
    • 0
この回答へのお礼

steel_grayさん

すごくイイアドバイスありがとうございました。
おかげで簡素に書く事ができました。

お礼日時:2009/02/23 22:31

>javascriptって値渡し


値渡しのみとは限らず、参照渡しもあります。
これはファンクションプやイベントプロシジャーへの
パラメーター受け渡し方法である。
今回の場合、グローバル変数diを重複宣言しており
後者のBBBの設定がAAAを打ち消している為ではないか思います。
変数名の重複を避けて、再試行してみてはどうでしょう。
    • good
    • 0
この回答へのお礼

Hardkingさんご回答ありがとうございます。

javascriptは値渡しと参照渡し混在なんですね。

アラウンドとして変数名の重複を避れば良いのは、
色々試した結果、わかってました。

でも、使い捨てられていく変数を多数用意するのって、微妙ですよね。

お礼日時:2009/02/23 18:38

オブジェクト(関数、配列etc..)の場合は参照渡しとなります。


observeの第三引数では関数オブジェクトを渡しているのでコードの実行は実際にイベントが発生した時に行われます。
    • good
    • 0
この回答へのお礼

steel_grayさん ご回答ありがとうございます。

実際にイベントが発生した時に行われてるってのがポイントですね。

お礼日時:2009/02/23 18:29

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