1

我正在使用TVMLCatalog中的“ Compilation.xml ”模板

我想将按钮单击事件添加到“ listItemLockup

<listItemLockup>
  <ordinal minLength="2" class="ordinalLayout">0</ordinal>
  <title>Intro</title>
  <subtitle>00</subtitle>
  <decorationLabel>(3:42)</decorationLabel>
</listItemLockup>

我试过添加:

App.onLaunch = function(options) {
    var templateURL = 'http://localhost:8000/hello.tvml';
    var doc = getDocument(templateURL);
    //doc.addEventListener("select", function() { alert("CLICK!") }, false);
    var listItemLockupElement = doc.getElementsByTagName("listItemLockup");
    listItemLockupElement.addEventListener("select", function() { alert("CLICK!") }, false);
}

添加事件监听器

void addEventListener (in String type, in Object listener, in optional Object extraInfo)

“选择”是正确的类型吗?

我一直在使用以下教程

http://jamesonquave.com/blog/developing-tvos-apps-for-apple-tv-with-swift/

http://jamesonquave.com/blog/developing-tvos-apps-for-apple-tv-part-2/


更新

我收到一个错误

ITML <Error>: doc.getElementsByTagName is not a function. (In 'doc.getElementsByTagName("listItemLockup")', 'doc.getElementsByTagName' is undefined) - http://localhost:8000/main.js - line:27:58

我尝试将此添加到“onLaunch”

var listItemLockupElements = doc.getElementsByTagName("listItemLockup");
for (var i = 0; i < listItemLockupElements.length; i++) {   
    //var ele = listItemLockupElements[i].firstChild.nodeValue;
    listItemLockupElements[i].addEventListener("select", function() { alert("CLICK!") }, false);
}

我先看看错误


交叉帖子:https ://forums.developer.apple.com/thread/17859

4

4 回答 4

5

我在 Apple 看到的更常见的示例是定义一个整体监听器,例如:

doc.addEventListener("select", Presenter.load.bind(Presenter));

在您的 xml 中,为元素分配唯一的 id,或为它们提供识别它们的方法。例如,开头会是这样的:

load: function(event) {
        var self = this,
            ele = event.target,
            attr_id = ele.getAttribute("id"),
            audioURL = ele.getAttribute("audioURL"),
            videoURL = ele.getAttribute("videoURL")

然后你可以对你的项目做任何你想做的事情。

if(audioURL && (event.type === "select" || event.type === "play")) {
//
}

我的建议是更仔细地研究 Presenter.js 文件以了解这种模式。

编辑:回答与 doc.getElementsByTagName 相关的“更新”不是一个函数。“doc”实际上并不存在,但一般模式是用

var doc = getActiveDocument();

我以为你会知道以上内容。这能解决吗?

于 2015-11-09T09:47:34.263 回答
1
var listItemLockupElement = doc.getElementsByTagName("listItemLockup”);

在这种情况下,listItemLockupElement 是 NodeList,而不是元素。您可以遍历列表并向每个 listItemLockup 添加事件侦听器,也可以将事件侦听器添加到包含元素。

于 2015-09-14T03:25:38.330 回答
0

在 NodeList 中寻址项目时,您使用 item(i) 方法而不是标准的数组访问表示法:

 listItemLockupElements.item(i).addEventListener("select", function() { })

请参阅:https ://developer.mozilla.org/en-US/docs/Web/API/NodeList/item

于 2015-09-24T10:06:03.227 回答
0

如果您使用的是atvjs框架,则添加事件侦听器很简单。

ATV.Page.create({
    name: 'mypage',
    template: your_template_function,
    data: your_data,
    events: {
        select: 'onSelect',
    },
    // method invoked in the scope of the current object and
    // 'this' will be bound to the object at runtime
    // so you can easily access methods and properties and even modify them at runtime
    onSelect: function(e) {
        let element = e.target;
        let elementType = element.nodeName.toLowerCase();

        if (elementType === 'listitemlockup') {
            this.doSomething();
        }
    },
    doSomething: function() {
        // some awesome action
    }
});

ATV.Navigation.navigate('mypage');

免责声明:我是atvjs的创建者和维护者,在撰写此答案时,它是唯一可用于使用 TVML 和 TVJS 进行 Apple TV 开发的 JavaScript 框架。因此我只能从这个框架中提供参考。答案不应被误认为是有偏见的意见。

于 2016-01-30T15:47:31.730 回答