2

我正在创建一个 Windows 8 HTML5 应用程序,并实现一个应用程序栏。当我访问 appbar.winControl 时,它始终为空。因此,例如,如果我编写 appbar.winControl.show() 我会收到一个异常,声称 winControl 为空。

我所做的是创建一个固定布局的应用程序。没有做任何其他事情,我在文档正文中添加了以下标记:

<body>
<div id="appbar" data-win-control="WinJS.UI.AppBar" aria-label="Command Bar">
    <button id="btnBoardSizeUp" data-win-control="WinJS.UI.AppBarCommand" data-win-options="{label:'Larger', icon:'zoomout', section:'global', tooltip:'Increase the board size'}" />
    <button id="btnBoardSizeDown" data-win-control="WinJS.UI.AppBarCommand" data-win-options="{label:'Smaller', icon:'zoomin', section:'global', tooltip:'Decrease the board size'}" />
    <button id="btnAbortGame" data-win-control="WinJS.UI.AppBarCommand" data-win-options="{label:'Abort', icon:'cancel', section:'selection', tooltip:'Abort the current game'}" />
</div>

<script type="text/javascript">
    var appbar = document.getElementById("appbar");
    var winControl = appbar.winControl;
    winControl.show();
</script>

winControl.show() 行产生以下错误:

0x800a138f - JavaScript 运行时错误:无法获取未定义或空引用的属性“显示”

据我所见,我已经在页面上正确实现了 appbar,所以它应该可以工作。知道出了什么问题吗?

4

2 回答 2

3

页面控件尚未初始化,脚本在此之前执行。

有两个地方可以放置此代码。无论是在

// if the app bar is part of default.html, appbar show can be put in default.js
// default.js already have a call to WinJS.UI.processAll under activated event handler
WinJS.UI.processAll().then(function ()
{
    appbar.winControl.show();
});

或者

// if the appbar is part of mypage.html, need to have code like this in mypage.js
WinJS.UI.Pages.define('/pages/mypage/mypage.html',
    {
         ready: function onready(element, options)
         {
             appbar.winControl.show();
         }
    }
于 2013-04-13T11:36:18.613 回答
1

每当您使用 winjs 控件(具有 data-win-control 属性的 div)来指定您想要的控件时。您还必须在 JavaScript 代码中调用 WinJS.UI.processAll 函数。WinJS.UI.processAll 解析您的标记并实例化它找到的任何用于 JavaScript 控件的 Windows 库。

  1. 如果您没有使用空白应用程序模板,或者如果您
    将控件添加到您自己创建的页面,您可能
    需要添加对 WinJS.UI.processAll 的调用。
  2. 如果您将控件添加到应用的主页(通常是 default.html 文件),请在 onactivated 事件处理程序中添加对 WinJS.UI.processAll 的调用,如前面的示例所示
  3. 如果您将控件添加到 Page 控件,则无需添加对 WinJS.UI.processAll 的调用,因为 Page 控件会自动为您执行此操作。
  4. 如果您将控件添加到不是您的应用主页的另一个页面,请处理 DOMContentLoaded 事件并使用处理程序调用 WinJS.UI.processAll。

函数初始化(){

WinJS.UI.processAll();

}

document.addEventListener("DOMContentLoaded", initialize(), false);

于 2013-07-15T06:19:30.300 回答