如何为jsviews创建自定义属性处理程序?

时间:2017-09-27 10:28:55

标签: javascript jquery html5-video jsrender jsviews

我想用JsViews播放html5视频内容,如下所示:

HTML:

<div id="result"></div>
<script id="myTmpl" type="text/x-jsrender">
    <video autobuffer controls data-link="muted{:muted}">
        <source id="mp4" data-link="src{:src}" type="video/mp4">
    </video>
    <button id="muted">change muted</button>
</script>

JS:

var data = {
    src: "http://grochtdreis.de/fuer-jsfiddle/video/sintel_trailer-480.mp4",
    muted: true
};

var myTmpl = $.templates("#myTmpl");

myTmpl.link("#result", data);

$("#result").on("click", "#muted", function () {
    $.observable(data).setProperty("muted", !data.muted);
});

example on jsfidle

可以看到默认处理的属性muted看起来像muted=truemuted=false,但在HTML specifications中 - 属性&#34;静音&#34;可能会也可能不会。也就是说,应该在disable处理{{1}}的属性:<{3}}。

也许有一些方法可以在jsviews中自定义(替换)标准的html属性处理程序?

1 个答案:

答案 0 :(得分:1)

您可以在mutedfalse时删除默认属性,写一下:

<video autobuffer controls data-link="muted{:muted||null}">

然而,由于动态删除或添加静音属性实际上不会使视频控件静音/取消静音,因此无法按预期工作。为此,您需要将静音元素上的静音属性设置为true / false。

此外,当用户点击视频元素UI上的内置静音控件时,您希望它能够显着修改您的muted数据属性。所有这些都可以使用以下代码:

var video = $("video");

$.observe(data, "muted", function(ev, eventArgs) {
    video[0].muted = eventArgs.value;
})

video.on("volumechange", function() {
    $.observable(data).setProperty("muted", video[0].muted);
});

以下是jsfiddle的更新版本,其中包含更改:http://jsfiddle.net/ck9sr49L/3/

我打算在下一个JsViews中添加一个新功能,以便能够选择数据链接到HTML元素的属性,而不是相应的属性。语法为data-link="prop-muted{:...}"(类似于数据链接到CSS属性data-link="css-muted{:...}")。通过该更新,您将能够简化并编写以下内容:

模板:

<video autobuffer controls data-link="prop-muted{:muted}">
    <source id="mp4" data-link="src{:src}" type="video/mp4"/>
</video>
<label>Muted: <input type="checkbox" data-link="muted"/></label>

代码:

var data = {
    src: "http://grochtdreis.de/fuer-jsfiddle/video/sintel_trailer-480.mp4",
    muted: true
};

var myTmpl = $.templates("#theTmpl");

myTmpl.link("#result", data);

$("video").on("volumechange", function(ev) {
    $.observable(data).setProperty("muted", ev.target.muted);
});