8

Google アナリティクスを介して HTML 以外のドキュメントを追跡するには、前述のアルゴリズムが必要です。そうすべき:

  • ドメインをハードコーディングしない
  • プロトコルを無視する (つまり、http/https)
  • 「www」の有無を気にする必要はありません (絶対リンクはすべて「www」で始まり、すべてのページは「www」経由で提供されます)。

これは、IE 専用の「attachEvent」から呼び出される関数を介してアクセスする必要があるため、複雑です。

更新申し訳ありませんが、私はこの質問を本当にひどく言いました。本当の問題は、これをイベント経由で機能させることです。IE には独自のイベント処理の世界があるからです。次のようにします。

function add_event(obj) {
    if (obj.addEventListener)
        obj.addEventListener('click', track_file, true);
    else if (obj.attachEvent)
        obj.attachEvent("on" + 'click', track_file);
}

function track_file(obj) { }

track_file の「obj」がブラウザ間で同じではないようです - IE でクリックされたものを参照するにはどうすればよいですか?

4

6 に答える 6

5

so.com を使用している場合、次のリンクは同じドメイン内の URL であることを指摘しておきます。

(奇妙に思えるかもしれませんが、最後の 2 つは有効です。 http://so.com を使用している場合最後の 1 つはhttp://so.com/mail.google.com/index に移動します。 php?var=value、これは完全に有効です)

これは実際には質問への回答ではありませんが、残りの回答を導くことを願っています. 他に何か変なところがあれば、自由に追加してください。

于 2008-11-25T11:59:41.443 に答える
3

これはコメディーの答えのように聞こえますが、真剣に次のようなこともできることをお勧めします。

$('a.external')

確かに、あなたの window.location との正規表現の比較は、プログラムによる答えです。

于 2008-11-25T12:21:28.417 に答える
3

IE と W3 のイベント リスナーの違いは、接続方法だけではありません。IE の場合、window.event.srcElement を読み取る必要があります。W3 では event.target で、event はコールバック関数に渡されるパラメーターです。

リンクに複数のイベント ハンドラーが必要ない場合は、古い学校の DOM 0 イベント ハンドラーを使用すると、おそらくこれにアプローチするのが簡単になります。これにより、「this」だけで任意のブラウザーでオブジェクトを取得できます。

function bindtolinks() {
    for (var i= document.links.length; i-->0;)
        document.links.onclick= clicklink;
}

function clicklink() {
    if (this.host==window.location.host) {
        dosomething();
        return true; // I'm an internal link. Follow me.
    } else {
        dosomethingelse();
        return false; // I'm an external link. Don't follow, only do something else.
    }
}
于 2008-11-25T12:35:47.813 に答える
1

IE のイベントに関する更新の質問に答えます。

function track_file(evt)
{
  if (evt == undefined)
  {
    evt = window.event; // For IE
  }
  // Use evt
}

ブラウザ間で一貫したイベント オブジェクトを取得する従来の方法です。

その後、正規表現を使用して URL を正規化しますが、何を気にしているのかわかりません。

[編集] 上で書いたことを実践するための実際のコード... :-)

function CheckTarget(evt)
{
  if (evt == undefined)
  {
    // For IE
    evt = window.event;
//~     event.returnValue = false;
    var target = evt.srcElement;
    var console = { log: alert };
  }
  else
  {
    target = evt.target;
//~     preventDefault();
  }
  alert(target.hostname + " vs. " + window.location.hostname);
  var re = /^https?:\/\/[\w.-]*?([\w-]+\.[a-z]+)\/.*$/;
  var strippedURL = window.location.href.match(re);
  if (strippedURL == null)
  {
    // Oops! (?)
    alert("Where are we?");
    return false;
  }
  alert(window.location.href + " => " + strippedURL);
  var strippedTarget = target.href.match(re);
  if (strippedTarget == null)
  {
    // Oops! (?)
    alert("What is it?");
    return false;
  }
  alert(target + " => " + strippedTarget);
  if (strippedURL[1] == strippedTarget[1])
  {
//~     window.location.href = target.href;  // Go there
    return true; // Accept the jump
  }
  return false;
}

これはテスト コードであり、プロダクション コードではありません。

//~ コメントのある行は、リンクをクリックしてジャンプしないようにする別の方法を示しています。Firebug の console.log を使用すると、不思議なことに false の戻り値が無効になるため、より効率的です。
ここでは、本当の最終的な目的を知らずに、「リンクをたどるかどうか」という動作を使用しました。

コメントで指摘されているように、RE は、href の代わりにホスト名を使用することで、より簡単にすることができます...既にコード化されており、他の場合に役立つ可能性があるため、そのままにしておきます。
どちらの場合も、ローカルホスト、IP アドレス、ポートなどの特殊なケースを処理するために、いくつかの特別な予防措置を講じる必要があります...
質問を読み直して問題がないことを確認する前に、ドメイン名を削除しました...まあ、おそらくそれは他の誰かに役立つ可能性があります。

注: リンクを装飾するために、質問で同様の解決策を示しました: Editing all external links with javascript

于 2008-11-25T12:36:54.877 に答える
0

クリック イベントと元のターゲット要素が与えられた場合、これは元の質問に対して機能するはずです。

if(target.protocol == window.location.protocol && target.host == window.location.host){
}

ブラウザーは、@Tom によって言及されたさまざまなパターンからリンクを完全なリンクに適切に変換するため、プロトコルとホストの値は単にドメインと一致する必要があります。

于 2010-10-19T15:17:31.283 に答える
-2
if( someDomElementWhichIsALink.href.indexOf(window.location) != -1 ) {
  // this is targeting your domain
}
于 2008-11-25T12:39:41.300 に答える