拦截传出链接 Angular 4
intercept outgoing links Angular 4
所以我编写了这个小应用程序,其中显示了从维基百科获取的一些信息。
在这个抓取的 HTML.
里面也有 links
所以我想做的是:
每次用户点击 link 我想拦截它并执行自定义行为而不是默认的浏览器重定向。
Angular http拦截器中的构建在这里不起作用。我如何获得这种效果?
编辑:
好像我误解了 href 和 http 请求的工作原理。我仍然想对每个 link 单击我的应用程序执行自定义行为。有没有办法拦截那些"events"?
编辑:
对于 Angular 2+ 解决方案,请查看下面的答案。是拦截标签的服务
加载新页面不是 XHR 请求。所以拦截器不能工作。您需要捕获点击事件并防止传播:
模板:
<a href="//example.com" (click)="myHandler($event)">Click me</a>
组件:
myHandler(event){
event.preventDefault();
doSomethingElse();
}
好的,在搜索了一段时间后,我找到了 "not angular" 解决方案:
Override default behaviour for link ('a') objects in Javascript
所以我用它创建了一个服务并将其注入到我的 App Root 组件中。
import { Injectable } from '@angular/core';
@Injectable() export class HrefInterceptorService {
constructor() {
document.onclick = this.interceptHref;
}
interceptHref(_event) {
const tEvent = _event || window.event;
const element = tEvent.target || tEvent.srcElement;
if (element.tagName === 'A') {
console.log("intercept!");
return false; // prevent default action and stop event propagation
}
} }
它有点老套但相对灵活。
我还需要跟踪出站点击次数,以便对使用 [innerhtml] 构建的页面进行分析。我尝试了很多东西,但结果证明答案非常简单。我只需要检查父级的几个级别以获得适当的 link 元素:
public hrefClicked( $event )
{
let targetElement;
if( ( $event.srcElement.nodeName.toUpperCase() === 'A') )
targetElement = $event.srcElement;
else if( $event.srcElement.parentElement.nodeName.toUpperCase() === 'A' )
targetElement = $event.srcElement.parentElement;
else
return;
// console.log( "Found LINK:" );
// console.log( targetElement.href );
if( targetElement.href && !targetElement.href.includes("mydomain"))
{
console.log( "OUTBOUND LINK:" + $event.srcElement.href );
}
}
<div class="container-fluid" (click)="hrefClicked($event)">
<div class="row">
<div class="col-xs-12">
<div class="article-body" [innerHTML]="article.content"></div>
</div>
</div>
</div>
所以我编写了这个小应用程序,其中显示了从维基百科获取的一些信息。 在这个抓取的 HTML.
里面也有 links所以我想做的是:
每次用户点击 link 我想拦截它并执行自定义行为而不是默认的浏览器重定向。
Angular http拦截器中的构建在这里不起作用。我如何获得这种效果?
编辑: 好像我误解了 href 和 http 请求的工作原理。我仍然想对每个 link 单击我的应用程序执行自定义行为。有没有办法拦截那些"events"?
编辑: 对于 Angular 2+ 解决方案,请查看下面的答案。是拦截标签的服务
加载新页面不是 XHR 请求。所以拦截器不能工作。您需要捕获点击事件并防止传播:
模板:
<a href="//example.com" (click)="myHandler($event)">Click me</a>
组件:
myHandler(event){
event.preventDefault();
doSomethingElse();
}
好的,在搜索了一段时间后,我找到了 "not angular" 解决方案: Override default behaviour for link ('a') objects in Javascript
所以我用它创建了一个服务并将其注入到我的 App Root 组件中。
import { Injectable } from '@angular/core';
@Injectable() export class HrefInterceptorService {
constructor() {
document.onclick = this.interceptHref;
}
interceptHref(_event) {
const tEvent = _event || window.event;
const element = tEvent.target || tEvent.srcElement;
if (element.tagName === 'A') {
console.log("intercept!");
return false; // prevent default action and stop event propagation
}
} }
它有点老套但相对灵活。
我还需要跟踪出站点击次数,以便对使用 [innerhtml] 构建的页面进行分析。我尝试了很多东西,但结果证明答案非常简单。我只需要检查父级的几个级别以获得适当的 link 元素:
public hrefClicked( $event )
{
let targetElement;
if( ( $event.srcElement.nodeName.toUpperCase() === 'A') )
targetElement = $event.srcElement;
else if( $event.srcElement.parentElement.nodeName.toUpperCase() === 'A' )
targetElement = $event.srcElement.parentElement;
else
return;
// console.log( "Found LINK:" );
// console.log( targetElement.href );
if( targetElement.href && !targetElement.href.includes("mydomain"))
{
console.log( "OUTBOUND LINK:" + $event.srcElement.href );
}
}
<div class="container-fluid" (click)="hrefClicked($event)">
<div class="row">
<div class="col-xs-12">
<div class="article-body" [innerHTML]="article.content"></div>
</div>
</div>
</div>