2014-09-01 48 views
0

我有一些咖啡文字,我正在使用它为我网站上的所有外部链接添加:external伪类。添加:咖啡脚本中的URL外部

jQuery.expr[":"].external = (obj) -> 
    obj.hostname isnt location.hostname 

我想要做的是允许例外,例如

jQuery.expr[":"].external = (obj) -> 
    obj.hostname isnt location.hostname unless obj.hostname is "domain.com" or "sub.domain.com" 

但是,这是行不通的。

回答

0

我不知道这jQuery和外部啄,但如果第一个例子是工作,那么你,如果你想显示为外部链接应该只返回true,所以你的情况:

jQuery.expr[":"].external = (obj) -> 
    obj.hostname not in [location.hostname, 'domain.com', 'sub.domain.com'] 
+0

还有一个问题需要跟进 - 我可以设置排除所有.domain.com子域的规则吗?例如* .domain.com - 没有全部指定它们? – strangerpixel 2014-09-22 11:25:58

0

首先,x is a or b不测试如果x要么ab;您正在寻找x is a or x is b。这也可以写成x in [a, b]无论如何编译为相同的东西。

其次后缀unless有点不寻常。 (a) -> b unless c编译成

function (a) { 
    if (!c) { 
    return b; 
    } 
} 

所以如果c是真实的,该函数返回undefined,这是falsey。所以这会起作用,但我会觉得这很混乱。其中的逻辑是真的:一个链接是外部的,只要链接目标不是非此即彼location.hostname,“domain.com”或“sub.domain.com”,即

obj.hostname isnt location.hostname and obj.hostname isnt "domain.com" and obj.hostname isnt "sub.domain.com" 

从而可以更简明地写为

obj.hostname not in [location.hostname, "domain.com", "sub.domain.com"] 

注意,也将适用于伪类的东西在那里obj.hostnameundefined,因为undefined肯定是不location.hostname。这可能不是你想要的。您可以使用obj.hostname? and obj.hostname not in [...]过滤出根本没有hostname的元素。

0

在最终我想要的是允许我的特定域的所有子域作为例外。所以 - 如果链接hrefs为空,它们处理js事件,或者它们指向domain.com的子域,请不要将它们视为外部链接,而是将外部链接分类为外部链接。

$.expr[":"].external = (obj) -> 
    h = obj.href 
    typeof h isnt 'undefined' and h.indexOf('#') is -1 and h.indexOf('javascript') is -1 and h.indexOf('domain.com') is -1