Здесь вы кешируете как элемент jQuerified, так и атрибут href.
var link = jQueryXD(this);
var href = link.attr('href');
Чем вы позже занимаетесь этим:
jQueryXD(link).attr('href').indexOf(this)
Вы можете вызвать link.attr('href').indexOf(this)
, так как link
уже является объектом jQuery, или вы можете использовать непосредственно href, который вы кэшировали, и сделать это href.indexOf(this)
.
Тем не менее я думаю, что ошибка, которую вы видите, возникает, когда ссылка не имеет атрибута href.Поэтому вам лучше проверить, не является ли href неопределенным, прежде чем продолжить свою логику.
Я протестировал его на jQuery 1.2.6 и 1.7.Кажется, он работает нормально.
Вот готовый сценарий.
var jQueryXD = jQuery.noConflict();
/* I added var because page loads 2 versions
of jquery - not the source of the problem.*/
function listenToClicks() {
var domains = ["domain1.com", "domain2.com"];
var fileTypes = [".pdf"];
jQueryXD('a').each(function(index) {
var link = jQueryXD(this);
var href = link.attr('href');
if(!href){
// This element doesnt have a href
return true;
}
var valid = false;
jQueryXD.each(fileTypes, function(i) {
if (href.indexOf(this) != -1) { //this is line 40
valid = false;
link.bind('click', function(c) {
c.preventDefault();
_gat._getTrackerByName()._trackEvent('Download', 'Click - ' + link.attr('href'));
setTimeout('document.location = "' + href + '"', 100);
});
}
});
jQueryXD.each(domains, function(j) {
try {
if ((href.indexOf(this) != -1) && (window.location.href.indexOf(this) == -1)) {
valid = true;
if (valid) {
link.bind('click', function(l) {
if (typeof(_gat) == "object") {
l.preventDefault();
if (link.attr('target') != "_blank") { // _gaq.push(['_link',jQueryXD(link).attr('href')]);
_gaq.push(['_link', href, true]); // mod
}
else {
var tracker = _gat._getTrackerByName();
//var fullUrl = tracker._getLinkerUrl(href);
var fullUrl = tracker._getLinkerUrl(href, true); //mod
window.open(fullUrl);
}
}
});
}
}
}
catch (e) {
//Bad A tag
}
});
var rootDomain = document.domain.split(".")[document.domain.split(".").length - 2] + "." + document.domain.split(".")[document.domain.split(".").length - 1];
if ((href.match(/^http/)) && (href.indexOf(rootDomain) == -1) && !valid) {
jQueryXD(link).bind('click', function(d) {
d.preventDefault();
_gat._getTrackerByName()._trackEvent('Outbound Link', href);
setTimeout('document.location = "' + href + '"', 100);
});
}
});
}
jQueryXD(document).ready(function() {
listenToClicks();
});
Но вы можете изобретать колесо здесь.Есть несколько лучших сценариев для достижения того же.Я думаю, что вам будет интересно посмотреть ГАЗ .Это оболочка для ga.js, которая расширяет и добавляет кучу вещей, включая crossDomain и downloadTracking.
Спойлер: Я главный разработчик GAS .
https://github.com/CardinalPath/gas