1

Twitter のツイート ボタンを保持する Web サイトがあります。ツイート ボタンをクリックするためのソーシャル イベントを追跡しようとしています。

新しいユニバーサル アナリティクスを使用しており、次の例に従っています: https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions

Twitter の場合、次のように JS を含めます。

<script async defer>
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');
</script>

Twitter で説明されているように、ツイート イベントへのバインディングに問題があります: https://dev.twitter.com/web/javascript/events

問題は、「twttr が定義されていない」ことです。ここに SO に関する同様の質問があります: ReferenceError: "twttr is not defined" even while using twttr.ready()

ここで同じアプローチを実装しようとしましたが、コンソール ログが表示されませんか?

<script>
window.addEventListener("load", function() {
    document.getElementById('twitter-wjs').addEventListener('load', function() {
      console.log('1');
        twttr.ready(function (twttr) {
          console.log('2');
            twttr.events.bind('tweet', function(e){
              console.log('3');
                if(!e) return;
                ga('send', 'social', 'twitter', 'tweet', theURL);
                console.log('tweet');
            })
        });
    }, false);
}, false);
</script>

GA で Twitter ツイートのクリックを追跡するにはどうすればよいですか?

4

1 に答える 1

2

問題は、オブジェクトのイベント コールバックload内に Twitter ウィジェット スクリプトのイベント ハンドラーを追加していることです。Twitter ウィジェットのスクリプト コードがページの初期コンテンツの一部である場合、ブラウザはそのスクリプトをダウンロードして、のイベントを発生させる前に実行します。windowloadwindowload

つまり、リスナーを追加する前に、スクリプトのイベントが既に発生loadしているため、スクリプトのハンドラーが実行されることはありません。load

スクリプトのリスナーtwttrを追加する前に、オブジェクトが存在するかどうかを確認するようにコードを更新できます。load

window.addEventListener("load", function() {

  function onTwttrReady() {
    twttr.events.bind('tweet', function(e){
      if(!e) return;
      ga('send', 'social', 'twitter', 'tweet', theURL);
      console.log('tweet');
    })
  }

  if (window.twttr) {
    onTwttrReady();
  } else {
    document.getElementById('twitter-wjs')
            .addEventListener('load', onTwttrReady);
  }
});
于 2015-07-14T22:24:06.363 に答える