URL 清理导致嵌入式 YouTube 视频的刷新

Posted

技术标签:

【中文标题】URL 清理导致嵌入式 YouTube 视频的刷新【英文标题】:URL sanitization is causing refresh of the embedded YouTube video 【发布时间】:2017-01-18 15:36:42 【问题描述】:

我的 AngularJS 2 应用程序有问题(我使用的是 AngularJS 2 的 RC5 版本)。似乎经过清理的 URL 正在触发更改检测,然后更新下面的 div,尽管我的组件状态没有任何更改。

从用户的角度来看,这表现为在播放视频时重新加载视频。

所以在我的组件视图中我有:

<div *ngIf="isVideo(item)">
   <iframe [src]="getTrustedYouTubeUrl(item)" scrolling="no" frameborder="0" allowfullscreen></iframe>          
</div>

上面的函数在组件代码中的实现是:

getTrustedYouTubeUrl(linkedVideo:LinkedVideoModel) 
    return this.sanitizer.bypassSecurityTrustResourceUrl(linkedVideo.video.url);
    

在调试器中,我看到 div 经常被 AngularJS 2 框架中触发的东西刷新。

如果我用硬编码的 URL 替换上面的 html sn-p,问题就会消失:

<div *ngIf="isVideo(item)">
   <iframe src="<hardcoded youtube url here>" scrolling="no" frameborder="0" allowfullscreen></iframe>          
</div> 

所以我怀疑是 URL 清理造成的。

谁能指出我正确的方向?将其 URL 绑定到组件上的属性的嵌入式 YouTube 视频的工作示例可能是?

【问题讨论】:

【参考方案1】:

想通了。

对于任何有兴趣的人。问题是在我的 html 中使用了这个函数

   [src]="getTrustedYouTubeUrl(item)"

当我在服务中加载数据并将 iframe 绑定更改为此时,更改代码以计算安全 url 后,重新加载的副作用就消失了

    <iframe [src]="item.video.safeUrl" scrolling="no" frameborder="0" allowfullscreen></iframe>    

请注意,我现在绑定到一个属性。

【讨论】:

在使用 [src]='sanitizer.bypassSecurityTrustResourceUrl(this.Url)' 几个月后,我突然出现了同样的问题。我不知道它为什么开始(角度 4.4 并且没有更新它)。但是,您的解决方案解决了它。谢谢! @Anthony 你是怎么解决的?我现在有同样的问题,我正在使用 Angular 2。我也在使用 [src]='sanitizer.bypassSecurityTrustResourceUrl(this.Url),但是当我将 src 绑定到一个属性时,我得到“错误错误:需要一个安全的 ResourceURL,得到了一个 URL(见g.co/ng/security#xss)”消息。 @handris 见我上面的回答。 在加载数据时如何更改计算安全 url 的代码?我无法解决这个问题:(【参考方案2】:

我会尝试将它与 pure pipe

一起使用

Angular 仅在检测到对 输入值。纯粹的改变要么是对原始输入的改变 值(字符串、数字、布尔值、符号)或更改的对象引用 (日期、数组、函数、对象)。

管道可能看起来像(RC.6 - DomSanitizer 变为而不是 DomSanitizationService):

@Pipe( name: 'safe' )
export class SafePipe implements PipeTransform 
  constructor(private sanitizer: DomSanitizer) 
  transform(url) 
    return this.sanitizer.bypassSecurityTrustResourceUrl(url);
  

并按如下方式使用:

<iframe [src]="url | safe" frameborder="0" allowfullscreen></iframe> 

Plunker Example(尝试按下按钮)

【讨论】:

谢谢,我会试试的。我已经找到了另一种解决方法,但这似乎是一个有趣的想法。 无法获取 /SafeValue%20must%20use%20[property]=binding:%20https://www.youtube.com/embed/wyVM1evRxNw%20(见%20http://g.co /ng/安全 不错的解决方案! Plunker 由于某种原因无法正常工作,这是最新版本Plunker Example(使用 Angular v4.2.3) @istibekesi 谢谢。我修复了 plunker 很好的解决方案我喜欢它。工作就像 Angular 5 中的魅力。谢谢【参考方案3】:

结合之前的答案使其以这种方式工作:

component.ts(仅相关部分)

import  DomSanitizer  from '@angular/platform-browser';

constructor( 
  private sanitizer: DomSanitizer   
) 
  this.sanitizer = sanitizer;


ngOnInit() 
 this.getTrustedUrl('http://someUrl');


getTrustedUrl(url:any) 
 this.safeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);

模板.html

<iframe      
  [src]='this.safeUrl'>
</iframe>

【讨论】:

正是我所需要的......这种应用程序允许消毒剂只运行一次。 这个问题已通过我的自动闪烁谷歌地图解决。谢谢【参考方案4】:

您可以保留原来的解决方案,只使用changeDetection: ChangeDetectionStrategy.OnPush

<div *ngIf="isVideo(item)">
   <iframe [src]="getTrustedYouTubeUrl(item)" scrolling="no" frameborder="0" allowfullscreen></iframe>          
</div>

【讨论】:

【参考方案5】:
<iframe #ytplayer    frameborder="0" src="">
</iframe>    

@ViewChild('ytplayer', null) ytPlayer: ElementRef;

ngOnInit() 
  this.ytPlayer.nativeElement.src = this.act.iframe;

由于使用了 sanitizer.bypassSecurityTrustResourceUrl 而发生重新加载。 所以我们不应该使用它。 我觉得这样更舒服。 谢谢。

【讨论】:

以上是关于URL 清理导致嵌入式 YouTube 视频的刷新的主要内容,如果未能解决你的问题,请参考以下文章

在不刷新页面的情况下将Youtube视频嵌入Angular JS的问题

如何嵌入新的 Youtube 直播视频永久 URL?

单个嵌入 URL 中的多个 YouTube 视频

YouTube 在直接 URL 和嵌入视频中放弃了 #t 开始时间支持?

Youtube 嵌入视频 - 删除最终信息屏幕

将 Youtube 视频嵌入 Facebook 并以特定时间码播放