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

おねがいします。
今JavaScriptを使ってiframeの中にそれぞれのリンクを読み込もうとしているのですが、
その全てのリンクが、特定のリンク(twitter.com)を指すようになってしまいます。
ソースは以下です

-------------------------------------------
var loaded_document = false;
var linksId = {
'scripts': { 'showed': 0 },
'cgi': { 'showed': 0 },
'blog': { 'showed': 0 },
'twitter': { 'showed': 0 }
};

function runOnLoad() {
if (loaded_document) return;

for (var id in linksId) {
linksId[id].url = document.getElementById(id).firstChild.href;
document.getElementById(id).firstChild.href = 'javascript:void(0);';
addHandler(
function () { alert('clicked ' + id); loadOnClick(id); },
document.getElementById(id),
'click'
);
}

loaded_document = true;
}
-------------------------------------------

このrunOnLoadがonloadの時に呼ばれるのですが、
どのリンクをクリックしても"clicked twitter"と表示されてしまいます。
クロージャ・・・?と思ったのですがJavaScriptに詳しくないのでよくわかりません。
誰か御教授くださいm(_ _)m

A 回答 (3件)

同様の質問が先日ありました。


以下をご参考に。(ほとんど同じ内容です)

 http://oshiete1.goo.ne.jp/qa4745251.html
    • good
    • 0
この回答へのお礼

解決しました!!
ありがとうございましたm(_ _)m

お礼日時:2009/03/06 20:28

判れば単純、ああなるほどってなるものなんだけど


結構みんな悩むのよね。

あなたのコードを別の書き方をするとこうなるのよ。(ざっくり省略)
function runOnLoad() {
for (var id in linksId) {
}
}
</script>
<a href="#" onClick="alert('clicked ' + id);">なにか</a>
onClickのコードはあくまでそのまま実行されるの。
idの値がtwitterになってしまうの判るわよね。

解決方法はいろいろあるけど
私ならオブジェクトにidの値を覚えさせるわ。

for (var id in linksId) {
linksId[id].url = document.getElementById(id).firstChild.href;
document.getElementById(id).firstChild.saveid = id;
document.getElementById(id).firstChild.href = 'javascript:void(0);';
addHandler(
function () { alert('clicked ' + this.saveid); loadOnClick(this.saveid); },
document.getElementById(id),
'click'
);
}

言いたいことが伝わるといいんだけど。
ちなみに動作確認していないので注意。
    • good
    • 0
この回答へのお礼

おぉ!!
document.getElementById(id).firstChild.saveid = id;
なんてことができるんですか!!!
HTML(DOM?)を直接いじるようでできないのかと思ってました。

こちらで確認したところ
alert(this.firstChild.saveid);
でちゃんと動きました。
HTMLの方をちゃんと見せなくてすいませんでした。

2度も教えて頂いてありがとうございましたm(_ _)m

お礼日時:2009/03/06 21:35

原因はシンプルよ。


addHandler内で設定している変数「id」だけど、
設定時は確かにforでまわしているように見えるわ

でもね、実行時はforループはすでに終了してしまっているの。
つまり、idはlinksIdの一番最後の値になっているわけ。

結果的にidは常に'twitter'になってしまっているのよ。

この回答への補足

↓間違えました
id_copiedをidの代わりに
の間違いでした

補足日時:2009/03/06 19:47
    • good
    • 0
この回答へのお礼

なるほど!
でもidってfor文で回す度に新しく生成されるんじゃないんですか・・・?
とりあえずfor文の初めに
var id_copied = new String(id);
としてidをid_copiedの代わりに使いまわしてみましたが変わりません。。。
基本型と参照型の違いがよく分かってないように思います。。。

どうすればいいんでしょうか?

お礼日時:2009/03/06 19:39

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