【问题标题】:open url on a tile using javascript and html in Win8 Metro App在 Win8 Metro App 中使用 javascript 和 html 在磁贴上打开 url
【发布时间】:2012-03-26 00:30:58
【问题描述】:

在 Windows 8 Metro 应用程序中,我希望 ListViewItems/Tiles 在单击后打开链接。问题是单击它们时没有任何反应。使用 addEventListener 我设法调用了该项目,但代码无法打开链接。

我像这样将我的 Tiles 存储在 default.js 文件中,我想访问“link”属性,它们都有一个。之后是 EventListener 和 Event (SelectItem):

var TileData = [
{ title: "Tile01", picture: "images/2.png", link: "http://www.gmail.com" },
{ title: "Tile02", picture: "images/1.png", link: "http://www.google.com" }
];

var dataList = new WinJS.Binding.List(TileData);

var publicMembers =
    {
        itemList: dataList
    };

WinJS.Namespace.define("DataExample", publicMembers);

WinJS.Application.onmainwindowactivated = function (e) {
    if (e.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
        WinJS.UI.processAll().then(function () {
            var TileList = document.getElementById('TileListView').winControl;
            TileList.dataSource = TileData;
            TileList.addEventListener('iteminvoked', SelectItem);
        });
    }
}

function SelectItem(e) {
    var selectedItem = TileData[e.detail.itemIndex];
    var selectedTileLink = document.getElementById('selectedTileLink');
    selectedTileLink.src = selectedItem.link;
    console.log('invoke ' + item.data.link);
    Windows.System.Launcher.launchUriAsync(new Windows.Foundation.Uri(selectedTileLink));
}

var app = WinJS.Application;

app.onactivated = function (eventObject) {
    if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
        if (eventObject.detail.previousExecutionState !== Windows.ApplicationModel.Activation.ApplicationExecutionState.terminated) {
        } else {
        }
        WinJS.UI.processAll(); //It reaches this point
    }
};

app.oncheckpoint = function (eventObject) {
};


app.start();

ListView 的模板和它的选项在这里,然后是 ListView 本身:

    <div id="TileItemTemplate" data-win-control="WinJS.Binding.Template">
        <div style="width: 200px; height: 100px;">
            <img src="#" style="width: 200px; height: 100px;"
                 data-win-bind="alt: title; src: picture" />
        </div>
    </div>       

    <div id="TileListView" data-win-control="WinJS.UI.ListView"
        data-win-options="{ 
                            itemTemplate: select('#TileItemTemplate'),
                            itemDataSource : DataExample.itemList.dataSource,
                            layout:{type:WinJS.UI.GridLayout} }" >
    </div>

所以我的问题是代码没有打开我在 SelectItem 函数中指定的链接。我将它存储在 selectedTileLink 中,但点击后没有任何反应。

有人可以帮我找出代码中的故障吗?

【问题讨论】:

    标签: javascript windows-8 microsoft-metro


    【解决方案1】:

    您可能想要使用 ListView 项目的onItemInvoked 事件。

    说,myItemList 是 DOM 中 listView 元素的 id,而不是模板的 id

    <div id="myItemList" class="myItemList" data-win-control="WinJS.UI.ListView"
                data-win-options="{layout: {type: WinJS.UI.GridLayout, groupHeaderPosition: 'top'}}"
                aria-label="Collections">
    </div>
    

    以下是如何编写此事件处理程序:

    function myItemInvoked (e) {
        var ix = e.detail.itemIndex;
        var myItemList = document.getElementById('myItemList');
        if (!myItemList ) {
            return;
        }
        var myItemListControl = myItemList.winControl;
        var binding = myItemListControl .itemDataSource.createListBinding();
        binding.fromIndex(ix).then(function (item) {
            console.log('invoke ' + item.data.link);
            binding.release();
            // open a browser to navigate to the url
            Windows.System.Launcher.launchUriAsync(new Windows.Foundation.Uri(item.data.link))
    
        });
    }
    

    当您 updateLayout 为您的 listView(或将数据源绑定到列表视图的任何位置)时,您可以像这样调用 WinJS.UI.setOptions

    WinJS.UI.setOptions(myItemListControl, {
          itemDataSource: myItemList.dataSource,
          itemTemplate: listItemTemplateRenderer, //your template element retrieved by getElementById
          groupDataSource: null,
          groupRenderer: null,
          selectionMode: 'single',
          oniteminvoked: itemInvoked
    });
    

    希望这会有所帮助。

    【讨论】:

    • 我是 Metro 开发的新手,我对您编写的事件处理程序有疑问。我仍然无法访问链接。是否有任何选项可以将“链接”存储为局部变量?例如:使用 onClick 我会运行一个 JS 函数,它将“链接”存储到一个局部变量中并使用该参数打开 Url。
    • @Lgn 我不太确定你在问什么。你能更详细地解释一下吗?您是否将数据源绑定到列表视图?在调试器中,是否调用了 itemInvoked 事件处理程序?谢谢。
    • 我更新了我的问题,展示了我的代码,如果不是太多,请看一下。
    • @Lgn 您的代码对我来说看起来不错,但我不必以这种方式为 itemInvoked 添加事件侦听器。 setOptions 足以让我调用它。如果您使用的是 VS11 创建的默认项目并且您的列表视图位于 groupedItemsPage.html 上,那么您的 handler 应该进入 groupedItemsPage.js 并将 groupedItemsPage.js 包含在 itemPage.html 的标题中。同样,如果您能告诉我事件处理程序是否已被调用,那将非常有帮助。你试过在 js 中而不是在 html 中使用WinJS.UI.setOptions 吗?
    • @Lgn 请同时提供有关您当前代码的症状的信息,以便您可以帮助人们识别问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2012-10-20
    相关资源
    最近更新 更多