0

我在使用使用JS 函数在一个字符串中查找两个不同值的if语句时遇到问题。indexOf如果它没有找到这两个值,则 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,其中包含我的示例代码。我在那里有一些链接可以测试并确保该过程有效,但目前还没有。

在小提琴中,我需要以下链接变为绿色(被跟踪),我也会列出需要避免的链接。

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/

4

4 回答 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')
       }

   });
于 2013-09-25T11:40:01.503 回答
0

对于您的具体示例,您可以编写

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

但实际上你只需要将 && 运算符替换为 || 一切都如你所愿。

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

那是因为您希望跳过包含两者的地址,sony/pro意味着您要跟踪的地址不包含sony/pro

于 2013-09-25T11:19:04.217 回答
0

看看这个小提琴

我更改了您的 javascript 代码,以避免 lnks 立即变红。未避免的链接将获得一个.click()事件处理程序,因此当您单击链接时,_gaq 代码被触发并且链接接收额外的类.tracked

还将运算符更改为 ||。

PS:注释掉_gaq 行,否则点击处理程序会输出错误。

希望这可以帮助!

于 2013-09-25T11:23:37.257 回答
0

您的操作符错误,您需要使用 || (或者)

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

此外,使用 indexOf() 存在兼容性问题,IE 范围在许多旧版浏览器中不支持它。

当您使用 jQuery 时,请尝试使用 $.inArray() - http://api.jquery.com/jQuery.inArray/

于 2013-09-25T11:24:06.533 回答