У меня возникают проблемы с использованием оператора if
который использует функцию indexOf
JS для поиска двух разных значений в одной строке. Если он не найдет эти два значения, то оператор if продолжит работу и выполняет свою функцию.
Цель моей функции $.each
- отслеживать все внешние ссылки, которые появляются на моем сайте, и исключать все внутренние, в которых есть слово "sony" и "/pro". Исключением должны быть эти две ссылки (http://www.response.pro.sony.eu/ и http://www.assets.pro.sony.eu/).
Так что я пытаюсь сделать, это не выполнять мою функцию (назначая onClick = ""), if
операторы indexOfs
находят два значения, которые я им даю. Это "/pro" и "sony"
Скрипт: http://jsfiddle.net/qj482/1/
Я предоставил JSFiddle своим примером кода. У меня есть несколько ссылок, чтобы проверить и убедиться, что процесс работает, но на данный момент это не так.
В Fiddle мне нужны следующие ссылки, чтобы повернуть зеленым (отследить), и я перечислил те, которые также нужно избегать.
http://www.pinewood.com/ - Tracked (green)
http://www.sony.co.uk/pro/hub/home - Avodied (red)
http://www.sony.co.uk/pro/hub/tree - Avodied (red)
http://www.sony.co.uk/pro/page/foo - Avodied (red)
http://www.sony.co.uk/pro/page/bar - Avodied (red)
http://www.response.pro.sony.eu/ - Tracked (green)
http://www.assets.pro.sony.eu/ - Tracked (green)
http://www.supermarsh.co.uk/pro-series - Tracked (green)
http://www.sony.co.uk/ - Avoided (red, has special .avoid class)
http://www.specialsite.com/ - Avoided (red, has special .avoid class)
Обратите внимание, что специальный класс ".avoid" существует только там, где клиент хочет избежать любой ссылки, если они хотят переопределить обнаружение.
Как я могу сделать эту работу? Здесь моя разметка и JS
HTML/разметки
<p>Adipiscing elit. Ut diam eget lectus sit amet elementum orci tincidunt. Aenean nibh mi, rhoncus eget placerat sit amet, iaculis sed sapien. Aenean porta felis vel nibh pretium ac pretium tortor auctor. Nam et ipsum est. Vestibulum tristique vulputate condimentum. Pellentesque vel justo tellus. Phasellus velit sapien, <a href="http://www.pinewood.com">http://www.pinewood.com</a> Integer eros enim, vulputate vitae dignissim eget, <a href="http://www.sony.co.uk/" class="avoid">www.sony.co.uk/</a> quis augue. Curabitur <a href="http://www.sony.co.uk/pro/hub/home">www.sony.co.uk/pro/hub/home</a> lorem <a href="http://www.sony.co.uk/pro/hub/tree">www.sony.co.uk/pro/hub/tree</a> orem <a href="http://www.sony.co.uk/pro/page/foo">www.sony.co.uk/pro/page/foo</a> lorem <a href="http://www.sony.co.uk/pro/page/bar">www.sony.co.uk/pro/page/bar</a> molestie, <a href="http://www.response.pro.sony.eu">www.response.pro.sony.eu</a> sem <a href="http://www.assets.pro.sony.eu">www.assets.pro.sony.eu</a> vitae <a class="avoid" href="http://www.specialsite.com">www.specialsite.com.</a> lobortis, sapien nisl euismod purus, non commodo lacus est vel turpis. Cras <a href="http://www.supermarsh.co.uk/pro-series">www.supermarsh.co.uk/pro-series</a> iaculis sagittis nisl, sed ultricies erat condimentum quis.</p>
JavaScript/Jquery
//:not("avoid") skips any <a> tags with the class '.avoid'
$('a[href*="http://"]:not(".avoid")').each(function(index, element) {
var hrefContent = $(this).attr('href');
domainName = hrefContent.replace('http://','');
console.log(domainName);
//Skip adding GA tracking if href contains the word sony
if(domainName.indexOf("/pro") == -1 && domainName.indexOf("sony") == -1)
{
$(this).attr('onclick','_gaq.push(["_trackEvent","Press Centre","email","'+domainName+'"]) ;_gaq.push(["b._trackEvent","Press Centre","email","'+domainName+'"]);').addClass('tracked');
} else {
$(this).addClass('avoided')
}
});
Спасибо за все ответы, но используя || оператор, похоже, работает только частично, когда добавляю простую ссылку, которая является внутренней (www.sony.co.uk), и ее следует избегать и краснеть, поскольку она содержит слово "сони". Вместо этого он становится зеленым и отслеживается. Может ли кто-нибудь исправить эту проблему?
См. Этот скрипт: http://jsfiddle.net/qj482/11/
Здесь вы идете, это не совсем очень красиво, но выполняет свою работу.
//:not("avoid") skips any <a> tags with the class '.avoid'
$('a[href*="http://"]:not(".avoid")').each(function (index, element) {
var hrefContent = $(this).attr('href');
domainName = hrefContent.replace('http://', '');
console.log(domainName);
//Skip adding GA tracking if href contains the word sony
if ((domainName.indexOf("\/pro\/") == -1 && domainName.indexOf("sony") == -1) || ((domainName.indexOf("sony") == -1 && domainName.indexOf("\/pro") > -1) || domainName.indexOf("www.response.pro.sony.eu") > -1 || domainName.indexOf("www.assets.pro.sony.eu") > -1)) {
$(this).attr('onclick', '_gaq.push(["_trackEvent","Press Centre","email","' + domainName + '"]) ;_gaq.push(["b._trackEvent","Press Centre","email","' + domainName + '"]);').addClass('tracked');
} else {
$(this).addClass('avoided')
}
});
Ваш оператор ошибается, вам нужно использовать || (или)
if (domainName.indexOf("/pro") == -1 || domainName.indexOf("sony") == -1)
Кроме того, существуют проблемы совместимости с использованием indexOf(), диапазон IE не поддерживает его во многих старых браузерах.
Когда вы используете jQuery, попробуйте использовать $.inArray() - http://api.jquery.com/jQuery.inArray/
Для вашего конкретного примера вы можете написать
if(domainName.indexOf("sony.co.uk/pro") == -1)
{
Но на самом деле вам просто нужно заменить && operator на || и все работает так, как вы хотели.
if(domainName.indexOf("/pro") == -1 || domainName.indexOf("sony") == -1)
{
Это потому, что вы хотите пропустить адреса, содержащие как sony
и /pro
что означает, что вы должны отслеживать адреса, не содержащие ни sony
ни /pro
.
Посмотрите эту скрипку.
Я изменил ваш код javascript, чтобы избежать lnks сразу же красным. .click()
ссылки получат обработчик события .click()
поэтому, когда вы нажимаете на ссылку, код _gaq запускается, а ссылка получает дополнительный класс .tracked
.
Также изменил оператор на ||.
PS: прокомментировал строки _gaq, потому что иначе обработчик клика выдает ошибку.
Надеюсь это поможет!