Оператор indexOf IF ищет два значения в одной строке, используя &&

0

У меня возникают проблемы с использованием оператора 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/

Теги:
indexof

4 ответа

1
Лучший ответ

Здесь вы идете, это не совсем очень красиво, но выполняет свою работу.

   //: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')
       }

   });
  • 0
    Ааа, теперь это возвращает результат, который я хочу, спасибо. Да, это не дико, но, как вы говорите, это работает. Могу ли я просто спросить, как можно изменить предложение, которое вы только что внесли, чтобы включить функцию jQueries inArray (), поскольку я только что обнаружил, что indexOf не очень хорошо поддерживается в IE. Не могли бы вы просто дать мне пример того, как я обновил бы / изменил один из indexOfs на inArray, а я сделаю все остальное?
  • 0
    Метод $ .inArray () похож на нативный метод JavaScript .indexOf () в том, что он возвращает -1, если не находит соответствия. Если первый элемент в массиве соответствует значению, $ .inArray () возвращает 0. Таким образом, в вашем коде использование будет примерно таким: $ .inArray ("sony", domainName)
0

Ваш оператор ошибается, вам нужно использовать || (или)

if (domainName.indexOf("/pro") == -1 || domainName.indexOf("sony") == -1)

Кроме того, существуют проблемы совместимости с использованием indexOf(), диапазон IE не поддерживает его во многих старых браузерах.

Когда вы используете jQuery, попробуйте использовать $.inArray() - http://api.jquery.com/jQuery.inArray/

  • 0
    Спасибо за ваш ответ, IE поддерживает тогда inArray?
  • 0
    $ .inArray на самом деле является методом jQuery, который сделан совместимым во всех браузерах (насколько я знаю?)
0

Для вашего конкретного примера вы можете написать

if(domainName.indexOf("sony.co.uk/pro") == -1)
    {

Но на самом деле вам просто нужно заменить && operator на || и все работает так, как вы хотели.

if(domainName.indexOf("/pro") == -1 || domainName.indexOf("sony") ==  -1)
    {

Это потому, что вы хотите пропустить адреса, содержащие как sony и /pro что означает, что вы должны отслеживать адреса, не содержащие ни sony ни /pro.

  • 0
    Хорошо, так || означает «или», и это, кажется, работает, но я не использовал || операторы, потому что я думал, что нужно убедиться, что в URL есть и "sony", и "/ pro". Разве этот метод (используя ||) не означает, что я получаю неожиданные результаты. Как URL, в котором есть только "/ pro"? Хотя я вижу это в скрипке, используя || взял мой пример "/ pro" и стал зеленым. Не уверен, как это работает, не могли бы вы объяснить, пожалуйста?
  • 0
    Также спасибо за ваш ответ :).
Показать ещё 1 комментарий
0

Посмотрите эту скрипку.

Я изменил ваш код javascript, чтобы избежать lnks сразу же красным. .click() ссылки получат обработчик события .click() поэтому, когда вы нажимаете на ссылку, код _gaq запускается, а ссылка получает дополнительный класс .tracked.

Также изменил оператор на ||.

PS: прокомментировал строки _gaq, потому что иначе обработчик клика выдает ошибку.

Надеюсь это поможет!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню