视频 html 使用通用 SSR 播放 angular2+ 指令
Video html play with angular2+ directive using Universal SSR
我目前正在尝试实施 Angular 指令,该指令会自动静音和播放 HTML5 视频标签。
我是运行这段代码在Angular10.我测试的所有浏览器都出现这个错误
这是我的代码。
<video appVideoAutoplayMuted [autoplay]="true" preload="metadata" playsinline [controls]="false" [loop]="true" [muted]="true"
poster="../../../assets/video-mask-spot.png">
<source src="../../../assets/neon-smash-gameplay-trailer.mp4#t=0.5"
type="video/mp4">
<source src="../../../assets/neon-smash-gameplay-trailer.webm#t=0.5"
type="video/webm">
<source src="../../../assets/neon-smash-gameplay-trailer.ogv#t=0.5"
type="video/ogg">
Your browser does not support the video tag.
</video>
指令组件看起来像
import { Directive, ElementRef, OnInit} from '@angular/core';
@Directive({
selector: '[appVideoAutoplayMuted]'
})
export class VideoAutoplayMutedDirective implements OnInit {
constructor(public videoElement: ElementRef) {
}
ngOnInit(): void {
const video: HTMLVideoElement = this.videoElement.nativeElement;
video.muted = true;
video.play(); // play is not a function exception
}
}
当代码到达 video.play();
行时它崩溃并给出下一个错误。
错误类型错误:video.play 不是函数
我调试了代码,video const不为null,他的类型是HTMLVideoElement。
Intellisense 也在工作。我在 mdn 中发现该函数存在。
我找到了解决方案。问题是代码是在 server-side 上调用的,因为我使用的是 Angular Universal。我不知道为什么,但似乎当 HTMLVideoElement 在服务器中时没有 play()
、load()
和其他方法。我认为这个方法是由浏览器实现的。
我通过 运行 指令中的 if 语句解决了检查代码在哪里的问题。
import {Directive, ElementRef, Inject, OnInit, PLATFORM_ID} from '@angular/core';
import {isPlatformBrowser} from '@angular/common';
@Directive({
selector: '[appVideoAutoplayMuted]'
})
export class VideoAutoplayMutedDirective implements OnInit {
constructor(public videoElement: ElementRef, @Inject(PLATFORM_ID) private platformId: any) {
}
ngOnInit(): void {
if (isPlatformBrowser(this.platformId)) { // here is the check
const video: HTMLVideoElement = this.videoElement.nativeElement;
video.muted = true;
video.play();
}
}
}
请随意扩展此答案,以便我们更好地了解正在发生的事情。
我目前正在尝试实施 Angular 指令,该指令会自动静音和播放 HTML5 视频标签。
我是运行这段代码在Angular10.我测试的所有浏览器都出现这个错误
这是我的代码。
<video appVideoAutoplayMuted [autoplay]="true" preload="metadata" playsinline [controls]="false" [loop]="true" [muted]="true"
poster="../../../assets/video-mask-spot.png">
<source src="../../../assets/neon-smash-gameplay-trailer.mp4#t=0.5"
type="video/mp4">
<source src="../../../assets/neon-smash-gameplay-trailer.webm#t=0.5"
type="video/webm">
<source src="../../../assets/neon-smash-gameplay-trailer.ogv#t=0.5"
type="video/ogg">
Your browser does not support the video tag.
</video>
指令组件看起来像
import { Directive, ElementRef, OnInit} from '@angular/core';
@Directive({
selector: '[appVideoAutoplayMuted]'
})
export class VideoAutoplayMutedDirective implements OnInit {
constructor(public videoElement: ElementRef) {
}
ngOnInit(): void {
const video: HTMLVideoElement = this.videoElement.nativeElement;
video.muted = true;
video.play(); // play is not a function exception
}
}
当代码到达 video.play();
行时它崩溃并给出下一个错误。
错误类型错误:video.play 不是函数
我调试了代码,video const不为null,他的类型是HTMLVideoElement。
Intellisense 也在工作。我在 mdn 中发现该函数存在。
我找到了解决方案。问题是代码是在 server-side 上调用的,因为我使用的是 Angular Universal。我不知道为什么,但似乎当 HTMLVideoElement 在服务器中时没有 play()
、load()
和其他方法。我认为这个方法是由浏览器实现的。
我通过 运行 指令中的 if 语句解决了检查代码在哪里的问题。
import {Directive, ElementRef, Inject, OnInit, PLATFORM_ID} from '@angular/core';
import {isPlatformBrowser} from '@angular/common';
@Directive({
selector: '[appVideoAutoplayMuted]'
})
export class VideoAutoplayMutedDirective implements OnInit {
constructor(public videoElement: ElementRef, @Inject(PLATFORM_ID) private platformId: any) {
}
ngOnInit(): void {
if (isPlatformBrowser(this.platformId)) { // here is the check
const video: HTMLVideoElement = this.videoElement.nativeElement;
video.muted = true;
video.play();
}
}
}
请随意扩展此答案,以便我们更好地了解正在发生的事情。