2016-10-22 2 views
0

タイトルとしてで複数のボタンにリスナーをクリックして追加し、私は一度に複数のボタンをクリックしてリスナーを追加しようとしています。 私は、以下のソースをしようとするけど、リスナーが正常に追加されますが、それはすべてのリンクを開きません。私は、関数が各要素にリスナーを追加するとき、socialLinks配列が未定義であることを意味します。誰かが私を助けることができる?は一度

$('.IndexBody').arrive('#shortUrl', function(){ 
     var shortUrl = $('#shortUrl').text(); 
     var socialTags = ['.entypo-twitter', '.entypo-facebook', '.entypo-gplus']; 
     var socialLinks = ["http://twitter.com/share?text=http://"+shortUrl+" — Link made by ", 
          "https://www.facebook.com/sharer/sharer.php?u="+shortUrl+"&src=sdkpreparse", 
          "https://plus.google.com/share?url="+shortUrl]; 
     console.log(socialLinks); 
     for(var i=0; i<3; i++){ 
      $(socialTags[i]).click(function(e) { 
      var width = 575, 
       height = 400, 
       left = ($(window).width() - width)/2, 
       top = ($(window).height() - height)/2, 
       opts = 'status=1' + 
         ',width=' + width + 
         ',height=' + height + 
         ',top=' + top + 
         ',left=' + left; 
      window.open(socialLinks[i], 'facebook', opts); 
      console.log(socialLinks[i]); 
      return false; 
      }) 
     } 
     }); 
+0

'べきだ " - リンクによって行われた"'エスケープするの? – guest271314

+1

'$(socialTags.join( ' '))。上(' クリック'、HANDLER)' – Rayon

+0

@ guest271314はい –

答えて

1

問題は、あなたがclosure内部iをキャプチャしているということですので、あなたは、関数を作成したときに、ボタンがクリックされたとき、それは値なのは、現在の値が、値ではなくなります。

このような何か試してみてください:

for(var i=0; i<3; i++){ 
    $(socialTags[i]).click(createHandler(socialLinks, i)); 
} 

function createHandler (socialLinks, i) { 
    return function (e) { 
     var width = 575, 
      height = 400, 
      left = ($(window).width() - width)/2, 
      top = ($(window).height() - height)/2, 
      opts = 'status=1' + 
        ',width=' + width + 
        ',height=' + height + 
        ',top=' + top + 
        ',left=' + left; 
     window.open(socialLinks[i], 'facebook', opts); 
     console.log(socialLinks[i]); 
     return false; 
    }; 
} 
+0

'for'ループ内で' handler() 'が呼び出されますか? – guest271314

+0

あなたがループしている、と*リターンは、ボタンがクリックされたときに実行される関数を*しながら、うん、ハンドラは、* *実行されます。このように、ループ中の 'i'の値(あなたが望む値)は、ハンドラ関数(' i'とも呼ばれる)への引数に格納されます。 –

+0

'handler'は' createHandler'という名前の方がいいでしょう - 更新されました。 –