20

我刚开始使用 HTML/JS 进行 Windows 8 开发。在过去的几个月里,我一直沉浸在针对汽车音响主机和电视的应用程序的 jQuery 开发中。

跳进去,我认为过渡会很简单。我的网站的设计和结构大部分都已弄清楚,并希望遵循我在以前的工作中使用的一些做法。

也就是说,我想基本上创建一个单页应用程序。主要的 default.html 文件将包含顶部导航/标题和另一个 div。另一个 div 将用于加载所有其他页面,项目中所有单独的 HTML 文件。

所有全局函数和主要功能都将驻留在 javascript 文件 application.js 中。然后任何特定于页面的 javascript 将驻留在每个 HTML 文件的顶部。

我很快意识到这是一个问题。使用 jQuery.load() 加载我的页面会导致我的应用程序出现安全错误。

JavaScript 运行时错误:无法添加动态内容。脚本试图注入可能不安全的动态内容或先前动态修改的元素。例如,使用 innerHTML 属性添加脚本或格式错误的 HTML 将生成此异常。使用 toStaticHTML 方法过滤动态内容,或使用 createElement 等方法显式创建元素和属性。

我真的希望避免学习一堆微软特有的东西。我认为他们提供了很多工具而没有提供很多工具很棒,也许我只是没有足够地使用它们,但是对于我以及我正在尝试做或已经可以完成的事情来说,一切都感觉太僵硬了用 jQuery。我喜欢确切地知道正在发生的事情并完全控制它。

还翻阅了模板和示例项目,我真的不喜欢所有重复的代码。例如,每个 HTML 文件都声明了所有相同的引用。我只想写一次我的引用和标题栏之类的部分,而不必在我的项目中复制/粘贴该代码。

有没有办法按照我希望的方式做事,并创建一个单页应用程序?他们有自己的 jQuery 的 .load() 替代品吗?

任何为我指明正确方向的帮助将不胜感激!

编辑 2012 年 8 月 14 日:

我已经尝试使用这个问题的修复: Using jQuery with Windows 8 Metro JavaScript App会导致安全错误

这消除了安全警告,我可以使用 jQuery.load() 加载 HTML。但是,查看 DOM 资源管理器,我的 HTML 被剥离了我的脚本。

我还尝试将我的 .load() 调用包装在 MSApp.execUnsafeLocalFunction() 中,但我的文件仍然被剥离了所有脚本。是什么赋予了?

4

3 回答 3

7

我通过简单地更改导致错误的 jQuery 行来修复。

jQuery-1.8.0,第 5566 行:

    append: function () {
        return this.domManip(arguments, true, function (elem) {
            if (this.nodeType === 1 || this.nodeType === 11) {
                self.appendChild(elem);  // problem line
            }
        });
    },

变成:

    append: function () {
        return this.domManip(arguments, true, function (elem) {
            if (this.nodeType === 1 || this.nodeType === 11) {
                var self = this;
                MSApp.execUnsafeLocalFunction(function () {
                    self.appendChild(elem);
                });
            }
        });
    },
于 2012-08-15T02:43:25.950 回答
3

有一种“正式”的方式来做你正在寻找的事情。
提供 WinJS.Navigation 以支持“单页应用程序”。例如,default.html将包含一个标记,该标记表示动态加载的页面内容的去向:

<div id="contenthost" 
    data-win-control="Application.PageControlNavigator" 
    data-win-options="{home: '/pages/home/home.html'}">
</div>

在上面的示例中,实际加载的内容页面位于/pages/home/home.html

在事件处理程序中,您可以简单地执行以下操作load或导航到另一个页面:

WinJS.Navigation.nav("/pages/other/page.html");

没错,它不是 jQuery,但效果很好 :)

于 2012-08-28T04:35:08.420 回答
1

根据您的应用程序,如果您不打算访问任何 WinRT 组件,您可以将页面导航到 ms-appx-web,这将更改页面周围的安全策略,但您无法从启动时指定此内容。您必须进行导航,并利用新的安全上下文。

另一个选项是使用 msWWA.execUnsafeLocalFunction 函数包装对 JQuery 的调用,这将使所有不安全的代码都被推入 DOM

于 2012-08-14T18:35:22.393 回答