2015-06-03 38 views
1

使用AnguarJS,我想随时在当前网站中单击的链接中存在特定主机名称时调用函数。用户将继续点击链接,但该功能将在后台调用。AngularJS路由 - 基于匹配URL主机名的调用函数

$ routeProvider是最好的方向去寻找这样的东西吗?它需要在网站范围内,这就是为什么我认为AngularJS routeProvider可能工作。我先问,因为我是Angular的新手。我试图避免必须识别每个点击事件来监听链接中的这个特定域名,因为有很多地方,并且因为正在使用CMS而发生更改。

谢谢!

+1

'$ routeProvider'只适用于“内部”应用程序路由('/#/ foo')。您可能需要监听这些外部链接上的点击事件。 –

+0

谢谢Sergui! 我试图避免必须识别每个点击事件以便在链接中监听此特定域名的原因是,有很多地方,并且因为正在使用CMS而发生更改。这就是为什么我希望使用$ routeProvider。当尝试匹配主机名,然后调用一个匹配的函数。例如,如果点击“adomainname.com”链接,我不需要重定向,只需调用一个函数即可。 由于您可以检查路径和参数字符串,不会路由提供者“查看”每个链接点击站点吗? 谢谢! – Scott

回答

0

使用$routeProvider您只能在同一个域和AngularJS上下文中定义路由。这是隐含的。因此,您只能在#符号(hashbang)之后“捕获”的URL段。

正如我所说的,你可能需要做:

$(body).on('click', 'a', function(e) { 
    var url = $(this).attr('url'); 
    // now do something with url 
}); 

我使用jQuery为了简单和event delegation性能方面的原因。

请注意,如果链接更改当前页面的URL,则此将不会工作。这意味着您正在导航到另一个页面并销毁当前JSR代码正在运行的那个页面,并且正在侦听click事件。例如,如果您在链接上使用target="_blank",则此功能才有效。

的一种方法,使其对外部和target="_self"环节的工作:

$(body).on('click', 'a', function(e) { 
    var url = $(this).attr('url'); 
    if(url === 'http://example.com/') { 
     e.preventDefault(); 
     // 1. do some stuff, even AJAX 
     // 2. after stuff completes: 
     window.location = url; 
    } 
}); 

这不幸意味着用户必须等待任何在(1)之前,他实际上采取了新的URL发生。如果你正在做的事情很快(不到一秒钟),或许隐藏在页面上的所有东西都可以和e.preventDefault一起使用。

+0

好的,这很有道理,它只能捕捉路径和参数。点击事件将改变当前页面的URL,所以这可能不起作用。 Pseudo:当在domain1上,并且请求转到domain2时,调用一个函数,然后在同一个窗口中转到domain2。 BTW:将被调用的函数将只加载domain2之前记录的一些分析信息。这个分析包不会为我们自动捕获,不幸的是它必须被告知。 – Scott

+0

查看我更新的答案,了解处理此案例的方法。它使用'event.preventDefault'和'window.location'。 –

相关问题