我已经尝试了几个小时,甚至去了谷歌的第 2 页寻求答案,但我就是无法找到有效的解决方案。我知道还有其他问题,相信我,我已经检查了所有问题,但没有人工作。其中 10 个在脚本中被注释掉。
我想做的是改变视频的速度,选项是 2.0、1.0 和 0.5 速度。当选择其中任何一个时,"onclick"中的功能将启动。但是我需要视频元素来更改播放速率。感谢所有帮助:)
<dom-module id="my-video">
<template>
<style include="shared-styles">
:host {
display: block;
padding: 10px;
}
/* Styles... */
</style>
<!-- If videoData.mime exists -->
<template is="dom-if" if="{{!isEmpty(videoData.mime)}}">
<video id="videoPlayer" onclick="Kuk(this)" poster="{{getThubnail(videoData.thumbnail)}}" controls>
<source src="uploadedFiles/{{videoData.userid}}/{{videoData.id}}.mp4" type="{{videoData.mime}}">
<track label="English subtitles" kind="subtitles" srclang="en" src="">
</video>
<div id="subtitles"></div>
</template>
<!-- If videoData.mime doesn't exists -->
<template is="dom-if" if="{{isEmpty(videoData.mime)}}">
<video id="videoPlayer" poster="{{getThubnail(videoData.thumbnail)}}" controls>
<source src="videos/subtitle-video.mp4" type="video/mp4">
<track label="English subtitles" kind="subtitles" srclang="en" src="/subtitles/subtitles0.vtt">
</video>
</template>
<!-- SPEED CONTROLS source: http://cssdeck.com/labs/ufct35ys5t -->
<div class="wrapper">
<div class="toggle_radio">
<input type="radio" onclick="{{speed_dobble}}" class="toggle_option" id="first_toggle" name="toggle_option">
<input type="radio" onclick="{{speed_normal}}" checked class="toggle_option" id="second_toggle" name="toggle_option">
<input type="radio" onclick="{{speed_half}}" class="toggle_option" id="third_toggle" name="toggle_option">
<label for="first_toggle">
<p class="other-title tri_toggle">2.0</p>
</label>
<label for="second_toggle">
<p class="other-title tri_toggle">1.0</p>
</label>
<label for="third_toggle">
<p class="other-title tri_toggle">0.5</p>
</label>
<div class="toggle_option_slider">
</div>
</div>
</div>
</template>
还有剧本:
<script>
class MyVideo extends Polymer.Element {
static get is() {
return 'my-video';
}
static get properties() {
return {
URL: {
type: String,
value: '/api/video.php?id='
}
/* some values */
};
}
/*Some code...*/
speed_dobble() {
console.log("Speed Dobble");
// var player = this.elementShadow.querySelector('#videoPlayer'); // <-- 1 Cannot read property 'querySelector' of undefined
// var player = this.shadowRoot.querySelector('video'); // <-- 2 Cannot read property 'querySelector' of null
// var player = $('#videoPlayer'); // <-- 3 $ is not defined
// var player = $(this.$.videoPlayer); // <-- 4 $ is not defined
// var player = this.$$('#videoPlayer'); // <-- 5 Not a function
// var player = this.$.videoPlayer.querySelector('video'); // <-- 6 Undefined
// var player = this.$.videoPlayer; // <-- 7 Undefined
// var player = this.$$['#videoPlayer']; // <-- 8 Undefined
// var player = Polymer.dom(this.root).querySelector("#video"); // <-- 9 null
// var player = document.getElementById('videoPlayer'); // <-- 10 null
console.log(player);
}
}
window.customElements.define(MyVideo.is, MyVideo);
</script>
正如 Cuttsy27 已经说过的,在 Polymer 中,您通常使用on-
前缀 + 事件名称以声明性方式附加事件,因此属性名称应on-click
。此外,如他的示例所示,但未提及,您需要以字符串形式提供回调名称。例如,">speed_double"不是数据绑定,因此不需要大括号。
因此,例如,这个:
<input type="radio" onclick="{{speed_dobble}}" class="toggle_option" id="first_toggle" name="toggle_option">
应该成为
<input type="radio" on-click="speed_dobble" class="toggle_option" id="first_toggle" name="toggle_option">
此外,我添加了新答案而不仅仅是评论的另一个原因是,通过 ID 获取元素的this.$.videoPlayer
"快捷方式"实际上可能不起作用。这是因为在this.$
下,您将在包含元素后立即找到可用的元素。因此,您不会找到有条件添加的元素,因为您的元素位于dom-if
中。因此,您可能希望尝试使用类似
this.shadowRoot.getElementById('videoPlayer')
例如
为每个输入字段设置一个值属性并在单击时调用单个函数(如"changeSpeed"(可能会有所帮助。 您可以将事件传递给函数以获取点击项的值,并将该值设置为视频的速度属性。
我相信,在这种情况下,this.$.videoPlayer应该是正确的选择器。
另外,请尝试使用on-click=""
而不是onclick=""
。
我会尝试这样的事情:
<input type="radio" value="1.0" on-click="changeSpeed" class="toggle_option" id="first_toggle" name="toggle_option">
<input type="radio" value="0.5" on-click="changeSpeed" checked class="toggle_option" id="second_toggle" name="toggle_option">
<input type="radio" value="2.0" on-click="changeSpeed" class="toggle_option" id="third_toggle" name="toggle_option">
我刚刚尝试过这个,它对我来说效果很好(聚合物 2(,其中 v 是我的video
元素的 id。
this.$.v.pause();
this.$.v.load();
this.$.v.playbackRate = 2;
为了扩展这一点,我将在您的元素中创建一个带有观察器的 videospeed 属性,该观察器根据我的示例调用函数来更改当前播放速度。
如果您仍然无法引用您的视频播放器,那么可能存在两个具有相同 id 的项目的问题(是的,我知道 DOM-IF 应该只创建其中一个,但只是一个猜测(。