0

我在一个 Windows 8 应用程序上工作,并且从我使用链接 hystory 来回运行该应用程序的页面中,我还有 3 或 4 个指向外部网站的链接(例如:facebook 或我的网站)。我尝试在 iframe 中运行它们,或者也让它们在默认浏览器中打开,如简单链接。这两种方法都导致 base.js 出现错误,说它无法处理我的错误(!?)我在这里问之前搜索了很多。我观看了运行良好的 msdn 示例,但如果我在我的应用程序中复制我需要的内容,则会导致相同的错误。我从另一个我没有转发历史的页面使用它,它有效,但我真的需要它在首页。有什么想法吗?非常感谢。

乐:

这是我的items.js代码:(对于 items.html 页面)

(function () {
    "use strict";

    var appViewState = Windows.UI.ViewManagement.ApplicationViewState;
    var ui = WinJS.UI;

    ui.Pages.define("/pages/items/items.html", {
        // This function is called whenever a user navigates to this page. It
        // populates the page elements with the app's data.
        ready: function (element, options) {
            var listView = element.querySelector(".itemslist").winControl;
            listView.itemDataSource = Data.groups.dataSource;
            listView.itemTemplate = element.querySelector(".itemtemplate");
            listView.oniteminvoked = this._itemInvoked.bind(this);

            this._initializeLayout(listView, Windows.UI.ViewManagement.ApplicationView.value);
            listView.element.focus();
            WinJS.Utilities.query("a").listen("click", this.linkClickEventHandler, false);
        },

        // This function updates the page layout in response to viewState changes.
        updateLayout: function (element, viewState, lastViewState) {
            /// <param name="element" domElement="true" />

            var listView = element.querySelector(".itemslist").winControl;
            if (lastViewState !== viewState) {
                if (lastViewState === appViewState.snapped || viewState === appViewState.snapped) {
                    var handler = function (e) {
                        listView.removeEventListener("contentanimating", handler, false);
                        e.preventDefault();
                    }
                    listView.addEventListener("contentanimating", handler, false);
                    var firstVisible = listView.indexOfFirstVisible;
                    this._initializeLayout(listView, viewState);
                    if (firstVisible >= 0 && listView.itemDataSource.list.length > 0) {
                        listView.indexOfFirstVisible = firstVisible;
                    }
                }
            }
        },




        linkClickEventHandler: function (eventInfo) {
            eventInfo.preventDefault();
            var link = eventInfo.target;
            WinJS.Navigation.navigate(link.href);
        },


        // This function updates the ListView with new layouts
        _initializeLayout: function (listView, viewState) {
            /// <param name="listView" value="WinJS.UI.ListView.prototype" />

            if (viewState === appViewState.snapped) {
                listView.layout = new ui.ListLayout();
            } else {
                listView.layout = new ui.GridLayout();
            }
        },

        _itemInvoked: function (args) {
            var groupKey = Data.groups.getAt(args.detail.itemIndex).key;
            WinJS.Navigation.navigate("/pages/split/split.html", { groupKey: groupKey });
        }
    });
})();

从 items.html 我有不同类型的链接:其中一些链接到其他应用程序页面,我可以从那里返回历史按钮返回/前进,其中一些链接到外部页面。简单<a href="http://www.example.com">link</a>。这些链接使我的应用程序因我在下面提到的错误而崩溃。如果我删除下一行:

 WinJS.Utilities.query("a").listen("click", this.linkClickEventHandler, false);

从我的 js 脚本中,外部链接有效,但我在其他人的应用程序页面中没有历史按钮。

4

1 回答 1

2

您正在尝试使用导航框架导航到外部 URI。它通常用于应用程序的本地上下文和可以包含“片段”的页面,以加载到您的主导航控件中。

我不会将锚标签与您的函数调用挂钩,而是在您的 linkClickEventHandler 中,我会执行以下操作以仅挂钩您的内部链接

WinJS.Utilities.query(".nav").listen("click", linkClickEventHandler, false);

反过来,您的内部链接将是

<a href="http://www.bing.com" class="nav">click me</a>

这种方法仅将导航框架挂钩到您的内部链接。另一种方法是检查处理程序中的“this.href”,如果它包含 http:// 或 https://,则改为调用 window.open

于 2013-05-09T18:38:03.283 回答