Статьи

Создание приложений для Магазина Windows с помощью jQuery 2.0

С выпуском Windows 8 Microsoft представила приложения для Магазина Windows , которые могут создаваться с использованием традиционных веб-языков, использующих базовые механизмы, поддерживающие Internet Explorer 10. Это означает, что jQuery 2.0 , разработанный для наилучшей работы в современных браузерах, находится прямо дома приложение для Магазина Windows!


Приложения Магазина Windows, в отличие от Интернета, имеют два разных контекста, известные как Локальный и Веб. Из-за доступа, который код в локальном контексте имеет к API времени выполнения Windows, потребовалась новая модель безопасности.

Для достижения наилучших результатов вы будете загружать jQuery и загружать его в локальном контексте. Попытка загрузки из удаленного местоположения (такого как CDN) приведет к появлению сообщения в духе «приложение не может загрузить удаленный веб-контент в локальном контексте».


Манипулирование DOM — одно из самых больших изменений, с которыми вы столкнетесь при использовании jQuery в приложении Магазина Windows, в отличие от браузера.

В Интернете нередко добавлять элемент в форму просто путем передачи строки HTML в метод .append() :

1
$(«#form»).append(«<input name=’foo’ value=’bar’ />»);

В приложении Windows Store, которое имеет легкий доступ к компьютеру пользователя, ставки намного выше, и многое из того, что вы привыкли делать, потребует некоторого пересмотра. Вышеуказанное считается небезопасным из-за атрибута name . Есть много других элементов, атрибутов, протоколов и многого другого, которые считаются небезопасными.

Полный список того, что считается безопасным и небезопасным, см. В разделе «Как сделать HTML безопаснее: подробности для toStaticHTML» .

Это не означает, что вы не можете программно заполнить контейнер динамическими элементами; Вы просто должны принять немного другой подход. Например, вы можете использовать jQuery для создания самого элемента ввода, а не передавать его в виде строки:

1
$(«<input>», { name: «foo», value: «bar» }).appendTo(«#form»);

В приведенном выше примере вы создаете элемент ввода, используя html атрибутов сигнатуры jQuery. Это демонстрирует модели безопасности, что вы полностью контролируете элемент, его атрибуты и соответствующие им значения. Этот шаблон одинаково хорошо работает и в браузере, присутствуя в jQuery начиная с версии 1.4.


При получении контента с удаленной конечной точки целесообразно очистить его, прежде чем помещать в DOM. Есть несколько способов сделать это с помощью вспомогательных функций, таких как toStaticHTML , который удаляет все динамические элементы из строки.

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

В следующем коде вы видите, что скрытое поле формы присоединилось к ответу.

1
<h1>Hello, Dave.</h1><input name=’id’ value=’a528af’ type=’hidden’ />

Внедрение этого в форму может иметь катастрофические последствия. Таким образом, вы должны сначала пропустить его через toStaticHTML чтобы очистить его от любых элементов, атрибутов или значений, которые можно использовать для манипулирования данными формы или выполнения других неутвержденных действий.

1
$(«#greeting»).html(toStaticHTML(response));

Когда метод видит нашу разметку для элемента ввода, он идентифицирует и удаляет атрибут динамического name , предотвращая попадание любых непредвиденных данных в отправку формы. Для более детального изучения того, что делает и не выживает метод toStaticHTML , взгляните на « Обеспечение безопасности HTML: подробности для toStaticHTML» .


Неизбежно будут моменты, когда вам нужно будет сделать что-то небезопасное. Например, вы можете захотеть использовать кусок HTML в качестве шаблона для создания новых элементов. В этих случаях Microsoft предоставила несколько методов, которые вы можете использовать при необходимости, и когда вы уверены, что то, что вы делаете, не подвергает пользователя риску.

В глобальном объекте MSApp в приложении Windows Store существует функция execUnsafeLocalFunction , которая выполняет именно то, что предлагает: позволяет выполнять небезопасную функцию в каждом конкретном случае. Возможно, вы захотите добавить поле ввода для редактирования имени пользователя, наш код может выглядеть очень похоже на последний пример:

1
<h1>Hello, <input name=»id» value=»Dave» /><h1>

Мы можем присвоить это свойству innerHTML через анонимную функцию:

1
2
3
MSApp.execUnsafeLocalFunction(function () {
    $(«#greeting»).html(response);
});

В рамках этой функции вы можете выйти из модели безопасности и выполнить небезопасную в противном случае операцию, не догадываясь об окружающей среде. Должно быть совершенно очевидно, почему вы должны использовать этот метод экономно.

В вашем приложении Windows Store под WinJS.Utilities также есть несколько утилит для выполнения аналогичных заданий. Это setInnerHTMLUnsafe и setOuterHTMLUnsafe . Как и execUnsafeLocalFunction , они также должны использоваться экономно, и когда вы не рискуете с данными вне вашего контроля.

Эти служебные функции принимают в качестве аргументов элемент DOM, которым вы хотите управлять, и строку, которую вы хотите назначить.

1
2
WinJS.Utilities.setInnerHTMLUnsafe( $(«#greeting»).get(0), response );
WinJS.Utilities.setOuterHTMLUnsafe( $(«#greeting»).get(0), response );

Разница здесь в том, что setInner заменяет innerHTML элемента, тогда как setOuter заменяет сам элемент — setOuter replaceWith . Для обеих функций вы просто передаете ссылку на элемент DOM и наш желаемый innerHTML.


В последнем разделе вы представили два объекта MSApp объект MSApp котором находится функция execUnsafeLocalFunction , а также объект WinJS котором находятся две служебные функции, setInnerHTMLUnsafe и setOuterHTMLUnsafe .

Эти объекты присутствуют только в приложении Магазина Windows, а не в вашем браузере (если кто-то или что-то не создало объекты с одинаковыми именами). Если вы хотите написать код, который может работать как в среде Магазина Windows, так и в вашем браузере, вам необходимо проверить эти объекты, прежде чем предполагать их существование.

1
2
3
4
5
6
7
var $greeting = $(«#greeting»);
 
if (typeof WinJS !== «undefined» && WinJS.Utilities) {
    WinJS.Utilities.setInnerHTMLUnsafe($greeting.get(0), response);
} else {
    $greeting.html(response);
}

В приложении Магазина Windows приведенный выше код будет использовать метод WinJS.Utilities для выполнения назначения. При запуске в среде, где WinJS неизвестен, например, в веб-браузере, код выполняет присваивание с помощью метода jQuery .html .


Возможность использовать удаленные сервисы — это часть того, что делает Интернет великолепным. В традиционном браузере у вас есть проблемы происхождения, которые привели к таким решениям, как JSONP и, в конечном счете, CORS. Поскольку приложения Магазина Windows работают в операционной системе, происхождение не имеет значения.

1
2
3
4
5
6
7
8
9
$.ajax(«http://api.twitter.com/1/statuses/user_timeline.json», {
    data: { screen_name: «appendTo» },
    success: function (data) {
        $(«<img>», { src: data[0].user.profile\_image\_url }).appendTo(«body»);
        $.each(data, function (key, tweet) {
            $(«<p>»).text(tweet.text).appendTo(«body»);
        });
    }
});

Вышеприведенное извлекает все последние твиты из учетной записи @appendTo и оборачивает каждый в свой собственный тег абзаца, помещая изображение профиля над ними. В приложении Магазина Windows это возможно без использования тега script , установки заголовков или прокси через сценарий на стороне сервера.


Хотя эта статья не является исчерпывающей, она предоставляет начальный импульс, необходимый для быстрого начала работы с jQuery в приложениях Магазина Windows. Веселиться!