Для отслеживания документов, отличных от HTML, с помощью Google Analytics мне нужен упомянутый алгоритм. Должно:
Это осложняется тем фактом, что мне нужно получить к нему доступ через функцию, вызываемую только из 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) { }
Похоже, что «obj» в track_file в разных браузерах не одно и то же - как я могу ссылаться на то, что было нажато в IE?
См. stackoverflow.com/questions/9404793/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я хотел бы отметить, что если вы находитесь на so.com, следующие ссылки являются URL-адресами в одном домене:
(это может показаться странным, но последние два действительны: если вы находитесь на http://so.com, последний приведет вас к http://so.com/mail.google.com/index.php?var=value, что совершенно верно)
На самом деле это не отвечает на вопрос, но я надеюсь, что это поможет в остальных ответах. Если есть еще что-то достаточно странное, не стесняйтесь добавлять это.
также href = "javascript: ..." - тот же домен, за исключением случаев, когда в нем есть изменение document.location, но что делать с этим - решать вам.
Это звучит как комедийный ответ, но, если серьезно, было бы желательно, чтобы вы также могли сделать что-то вроде:
$('a.external')
Конечно, сравнение регулярного выражения с вашим window.location - это программный ответ.
Поскольку внешние ссылки обычно размещаются с помощью target = "_blank", чтобы посетители не покидали страницу, вы также можете использовать этот атрибут.
Может это поможет: http://www.quirksmode.org/js/events_properties.html#target
Способ подключения - не единственное, чем отличаются слушатели событий IE и W3. Для IE вы должны прочитать window.event.srcElement; в W3 это event.target, где событие - это параметр, переданный функции обратного вызова.
Если вам не нужны несколько обработчиков событий для ссылок, старые обработчики событий 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.
}
}
Было бы здорово, если бы я мог уйти от старой школы, но это должен быть очень общий сценарий, который применяется ко всем ссылкам на странице, некоторые из которых могут иметь уже существующие обработчики событий.
Если вы знаете, что работаете после других обработчиков событий, вы, конечно, можете сохранить (link.orig_onclick = link.onlick) и повторно вызвать существующий обработчик событий.
Отвечу на вопрос в обновлении, о событиях в 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.info, любопытно, что return false неэффективен. Я использовал здесь поведение «переходить по ссылке или нет», не зная истинной конечной цели.
Как указано в комментариях, RE может быть проще, если использовать имя хоста вместо href ... Я оставляю его в таком виде, потому что он уже был закодирован и может быть полезен в других случаях.
В обоих случаях следует принять некоторые особые меры предосторожности для обработки особых случаев, таких как localhost, IP-адреса, порты ...
Я избавился от доменного имени, прежде чем перечитать вопрос и убедиться, что это не проблема ... Что ж, возможно, это может быть полезно кому-то еще.
Примечание: я показал аналогичное решение в вопросе для украшения ссылок: Редактирование всех внешних ссылок с помощью javascript
На самом деле у меня работают evt.srcElement.hostname (IE) и this.hostname (другие)
if ( someDomElementWhichIsALink.href.indexOf(window.location) != -1 ) {
// this is targeting your domain
}
Это не приведет к правильному обнаружению одного и того же / другого домена.
Учитывая событие щелчка и исходный целевой элемент, это должно работать для исходного вопроса:
if (target.protocol == window.location.protocol && target.host == window.location.host){
}
Браузеры прекрасно конвертируют ссылку из различных шаблонов, упомянутых @Tom, в полные ссылки, поэтому значения протокола и хоста просто должны соответствовать вашему домену.
Это документ, который вы открываете в браузере?