44 votes

L'utilisation de jQuery avec l'application JavaScript Metro de Windows 8 provoque une erreur de sécurité

Puisque ça ressemblait à jQuery était une option pour les applications JavaScript de Metro. Je commençais à attendre avec impatience le développement de Windows 8. J'ai installé Visual Studio 2012 Express RC et j'ai commencé un nouveau projet (les deux modèles, vide et grille, ont le même problème).

J'ai fait une copie locale de jQuery 1.7.2 et l'ai ajouté comme référence script.

<!-- SomeTestApp references -->
<link href="http://stackoverflow.com/css/default.css" rel="stylesheet" />
<script src="/js/jquery-1.7.2.js"></script>
<script src="/js/default.js"></script>

Malheureusement, dès que j'ai lancé l'application résultante, une erreur de console s'est produite :

HTML1701 : Impossible d'ajouter du contenu dynamique ' a' Un script a essayé d'injecter du contenu dynamique, ou des éléments précédemment modifiés dynamiquement, qui pourraient être dangereux. Pour Par exemple, l'utilisation de la propriété innerHTML pour ajouter du script ou du HTML malformé. générera cette exception. Utilisez la méthode toStaticHTML pour filtrer le contenu dynamique contenu dynamique, ou créez explicitement des éléments et des attributs avec une propriété telle que createElement. Pour plus d'informations, voir http://go.microsoft.com/fwlink/?LinkID=247104 .

J'ai placé un point d'arrêt dans une version non minifiée de jQuery et j'ai trouvé la ligne incriminée :

div.innerHTML = "   <link/><table></table><a href='http://stackoverflow.com/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";

Apparemment, le modèle de sécurité pour les applications Metro interdit de créer des éléments de cette manière . Cette erreur ne cause pas de problèmes immédiats pour l'utilisateur, mais étant donné son emplacement, je crains qu'elle ne fasse échouer les tests de découverte des capacités dans jQuery.

Je veux définitivement jQuery $.Deferred pour rendre tout plus facile. Je préférerais pouvoir utiliser le moteur de sélection et les systèmes de gestion des événements, mais je pourrais m'en passer si je le devais.

Comment faire pour que la dernière version de jQuery soit compatible avec le développement de Metro ?

33voto

Adam Freeman Points 974

Vous devez modifier le code source de jQuery de manière à passer l'option jQuery.support à la fonction MSApp.execUnsafeLocalFunction qui désactive la vérification du contenu non sécurisé, comme ceci :

jQuery.support = MSApp.execUnsafeLocalFunction(function() {

    var support,
        all,
        a,
        select,
        opt,
        input,
        fragment,
        tds,
        events,
        eventName,
        i,
        isSupported,
        div = document.createElement( "div" ),
        documentElement = document.documentElement;

    // lots of statements removed for brevity

    return support;
});

Vous devez vous rappeler d'enlever la dernière paire de parenthèses - vous n'avez pas besoin d'une fonction auto-exécutrice car execUnsafeLocalFunction exécute automatiquement la fonction qui lui est passée.

Je suggère qu'une meilleure approche consiste à utiliser les fonctionnalités de WinJS, notamment la fonction WinJS.Promise comme une alternative aux opérations différées (qui sont elles-mêmes une mise en œuvre du modèle Promise). Et vous pouvez faire quelques manipulations basiques du DOM en utilisant la fonction WinJS.Utilities espace de noms.

Vous devriez réfléchir à deux fois avant d'utiliser jQuery pour des opérations différées. Le site WinJS.Promise est utilisé dans l'ensemble des API Metro pour représenter les activités asynchrones et vous finirez par utiliser deux approches similaires mais différentes.

8voto

NikhilRanjanMSP Points 194

Voici votre réponse

https://github.com/appendto/jquery-win8

Sa bibliothèque jquery officielle pour Windows 8

7voto

Rob M. Points 5205

Pour ce que ça vaut, j'ai porté la majorité du noyau de jQuery pour envelopper la bibliothèque native de WinJS. C'est léger et fournit à peu près tout ce que jQuery fait avec l'ajout de quelques plugins pour les badges, les notifications, etc.

Il s'agit d'un travail en cours, mais j'essaie de faire en sorte que certaines personnes se joignent à l'aventure.

https://github.com/rmcvey/winjq

Résumé rapide (la documentation est en train d'être complétée) : http://practicaljs.com/jquery-in-Windows-8-apps/

7voto

Sagar Sane Points 71

Après le récent //Build/ 2012 conférence et cette discussion parle de l'utilisation de jQuery dans les applications Windows 8 Store. Plus précisément, ils parlent de l'exception exacte de script à l'intérieur de innerHTML et parler des mises à jour effectuées dans ce domaine.

L'entreprise AppendTo également dévoilé officiellement jQuery pour Windows 8 pendant cette conférence. La démonstration faite lors de l'exposé dans le lien ci-dessus semble très bien fonctionner.

Ils disent également que ce n'est pas une bonne idée d'obtenir jQuery à partir d'un CDN pour les applications Windows 8 dans un contexte local !

6voto

buildwinjs Points 1

El JavaScript Dynamic Content shim sur GitHub a été créé et publié par Microsoft Open Technologies pour résoudre cette erreur. Il n'a pas été testé avec jQuery mais résoudra très probablement votre problème. Référencez le fichier winstore-jscompat.js au début de votre application avant l'exécution de tout autre script et vous ne devriez plus voir cette erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X