- ベストアンサー
全てのリンクがtwitterを指すようになる
おねがいします。 今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
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
同様の質問が先日ありました。 以下をご参考に。(ほとんど同じ内容です) http://oshiete1.goo.ne.jp/qa4745251.html
その他の回答 (2)
- askaaska
- ベストアンサー率35% (1455/4149)
判れば単純、ああなるほどってなるものなんだけど 結構みんな悩むのよね。 あなたのコードを別の書き方をするとこうなるのよ。(ざっくり省略) 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' ); } 言いたいことが伝わるといいんだけど。 ちなみに動作確認していないので注意。
お礼
おぉ!! document.getElementById(id).firstChild.saveid = id; なんてことができるんですか!!! HTML(DOM?)を直接いじるようでできないのかと思ってました。 こちらで確認したところ alert(this.firstChild.saveid); でちゃんと動きました。 HTMLの方をちゃんと見せなくてすいませんでした。 2度も教えて頂いてありがとうございましたm(_ _)m
- askaaska
- ベストアンサー率35% (1455/4149)
原因はシンプルよ。 addHandler内で設定している変数「id」だけど、 設定時は確かにforでまわしているように見えるわ でもね、実行時はforループはすでに終了してしまっているの。 つまり、idはlinksIdの一番最後の値になっているわけ。 結果的にidは常に'twitter'になってしまっているのよ。
お礼
なるほど! でもidってfor文で回す度に新しく生成されるんじゃないんですか・・・? とりあえずfor文の初めに var id_copied = new String(id); としてidをid_copiedの代わりに使いまわしてみましたが変わりません。。。 基本型と参照型の違いがよく分かってないように思います。。。 どうすればいいんでしょうか?
補足
↓間違えました id_copiedをidの代わりに の間違いでした
お礼
解決しました!! ありがとうございましたm(_ _)m