Подтвердить что ты не робот

Создание приложения Windows 8 Metro с помощью jQuery

Я только начинаю разработку Windows 8 с помощью HTML/JS. Последние несколько месяцев я провел в разработке jQuery для приложений, ориентированных на головные устройства и телевизоры.

Прыгая в это, я думал, что переход будет простым. У меня есть дизайн и структура моего сайта, которые все выяснялись по большей части и надеялись следовать некоторым из тех практик, которые я использовал для своей предыдущей работы.

То есть, я хочу по существу создать одностраничное приложение. Основной файл default.html будет содержать верхнюю навигацию/заголовок и еще один div. Другой div будет использоваться для загрузки на всех других страницах, все отдельные HTML файлы в проекте.

Все глобальные функции и основные функции будут находиться в файле javascript, application.js. Тогда любой javascript, специфичный для страницы, будет находиться в верхней части каждого файла HTML.

Я быстро понимаю, что это проблема. Использование jQuery.load() для загрузки на моих страницах приводит к ошибкам безопасности в моем приложении.

Ошибка выполнения JavaScript: невозможно добавить динамический контент. A script попытался добавить динамический контент или элементы, ранее измененные динамически, что может быть небезопасным. Например, с помощью свойства innerHTML для добавления script или неверного HTML будет создано это исключение. Используйте метод toStaticHTML для фильтрации динамического содержимого или явно создавайте элементы и атрибуты с помощью метода, такого как createElement.

Я действительно надеялся избежать необходимости изучать кучу специфических для Microsoft материалов. Я думаю, что здорово, что они предоставили множество инструментов, а что нет, и, может быть, я просто не использовал их достаточно, но все просто слишком жестко для меня и для того, что я пытаюсь сделать или уже может быть достигнуто с jQuery. Я тот, кто любит ТОЧНО, что происходит и имеет полный контроль над ним.

Также просматривая шаблоны и примеры проектов, мне действительно не нравится весь повторяющийся код. Например, каждый HTML файл, объявляющий все те же ссылки. Я хочу писать свои ссылки и разделы, как моя строка заголовка, только один раз, и не нужно копировать/вставлять этот код по всему моему проекту.

Есть ли способ сделать то, что я надеялся, и создать одностраничное приложение? У них есть своя замена jQuery.load()?

Любая помощь, указывающая мне в правильном направлении, будет очень признательна!

EDIT 8/14/2012:

Я попытался использовать исправление из этого вопроса: Использование jQuery с Windows 8 Приложение Metro JavaScript вызывает ошибки безопасности

Это избавляет от предупреждения о безопасности, и я могу загрузить его в HTML с помощью jQuery.load(). Однако, глядя на DOM-проводник, мой HTML лишен моих скриптов.

Я также попытался обернуть мой вызов .load() внутри MSApp.execUnsafeLocalFunction(), но опять же мой файл по-прежнему лишен всех скриптов. Что дает?

4b9b3361

Ответ 1

Существует "формальный" способ делать то, что вы ищете.
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, но он отлично работает:)

Ответ 2

Я исправил, просто изменив строку 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);
                });
            }
        });
    },

Ответ 3

В зависимости от вашего приложения, если вы не намереваетесь получить доступ к каким-либо компонентам WinRT, вы можете перемещать свою страницу в ms-appx-web, которая изменит политику безопасности на странице, но вы не можете указать это из запуска, Вам нужно будет выполнить навигацию и использовать этот новый контекст securyt.

Другим вариантом, который у вас есть, является перенос вызовов в JQuery с помощью функции msWWA.execUnsafeLocalFunction, которая позволит включить весь этот небезопасный код в DOM