Die Verwendung von jQuery mit der Windows 8 Metro JavaScript App verursacht einen Sicherheitsfehler
Lesezeit: 7 Minuten
Patridge
Da klang es so jQuery war eine Option für Metro-JavaScript-Apps, Ich fing an, mich auf die Entwicklung von Windows 8 zu freuen. Ich habe Visual Studio 2012 Express RC installiert und ein neues Projekt gestartet (sowohl leere als auch Rastervorlagen haben das gleiche Problem).
Ich habe eine lokale Kopie von jQuery 1.7.2 erstellt und als Skriptreferenz hinzugefügt.
Sobald ich die resultierende App ausgeführt habe, wird leider ein Konsolenfehler ausgegeben:
HTML1701: Dynamischer Inhalt ‘a’ kann nicht hinzugefügt werden. Ein Skript hat versucht, dynamischen Inhalt oder zuvor dynamisch geänderte Elemente einzufügen, die möglicherweise unsicher sind. Wenn Sie beispielsweise die innerHTML-Eigenschaft zum Hinzufügen von Skripts oder fehlerhaftem HTML verwenden, wird diese Ausnahme generiert. Verwenden Sie die toStaticHTML-Methode, um dynamische Inhalte zu filtern, oder erstellen Sie explizit Elemente und Attribute mit einer Methode wie createElement. Weitere Informationen finden Sie unter http://go.microsoft.com/fwlink/?LinkID=247104.
Ich habe einen Haltepunkt in einer nicht minimierten Version von jQuery gesetzt und gefunden die beleidigende Linie:
Offenbar das Sicherheitsmodell für Metro-Apps verbietet das Erstellen von Elementen auf diese Weise. Dieser Fehler verursacht keine unmittelbaren Probleme für den Benutzer, aber angesichts seiner Position mache ich mir Sorgen, dass er dazu führen wird, dass Capability-Discovery-Tests in jQuery fehlschlagen, die nicht sollten.
Ich möchte auf jeden Fall jQuery $.Deferred um so ziemlich alles einfacher zu machen. Ich würde es vorziehen, die Selektor-Engine und die Event-Handling-Systeme verwenden zu können, aber ich würde ohne sie leben, wenn ich müsste.
Wie bringt man die neueste jQuery dazu, gut mit der Metro-Entwicklung zu spielen?
Laden Sie jquery über ein cdn?
– Lukuma
2. Juni 12 um 3:35 Uhr
Nein. Dies ist ein Fehler, der bei der Ausführung des lokalen jQuery-Codes ausgelöst wird.
– Patridge
2. Juni 12 um 4:21 Uhr
Nebenbei bemerkt sieht es so aus, als könnte ich a lernen neues Versprechungssystem anstelle von jQuery $.Deferred.
– Patridge
2. Juni 12 um 4:28 Uhr
jQuery 1.8 benötigt zwei weitere Modifikationen, um einwandfrei mit Windows 8 zusammenzuarbeiten. Ich habe a geschrieben Blogeintrag das die notwendigen Änderungen behandelt, einige Hintergrundinformationen liefert und eine “gepatchte” Version von jQuery 1.8 bereitstellt.
Sie müssen die jQuery-Quelle bearbeiten, damit Sie die jQuery.support Funktion zu MSApp.execUnsafeLocalFunctionwodurch die Überprüfung unsicherer Inhalte wie folgt deaktiviert wird:
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;
});
Sie müssen daran denken, das letzte Klammerpaar zu entfernen – Sie benötigen keine selbstausführende Funktion, weil execUnsafeLocalFunction führt die übergebene Funktion automatisch aus.
Ich schlage vor, dass ein besserer Ansatz darin besteht, die WinJS-Funktionen zu verwenden – dazu gehören die WinJS.Promise -Objekt als Alternative zu zurückgestellten Operationen (die selbst eine Implementierung des Promise-Musters sind). Und Sie können einige grundlegende DOM-Manipulationen mit dem durchführen WinJS.Utilities Namensraum.
Sie sollten es sich zweimal überlegen, jQuery für verzögerte Operationen zu verwenden. Der WinJS.Promise -Objekt wird in allen Metro-APIs verwendet, um asynchrone Aktivitäten darzustellen, und Sie werden am Ende zwei ähnliche, aber unterschiedliche Ansätze verwenden.
Super, das hat mich auch genervt und der Fix hat perfekt funktioniert. Falls jemand keine Lust dazu hat oder sich nicht mit der jQuery-Quelle herumschlagen möchte, ist dies eine verkleinerte Version, die ich gerade für mich selbst erstellt habe: pastebin.com/0NC6XBFp.
– Zac Seth
2. Juni 12 um 17:33 Uhr
Genau wie ein Datenpunkt verursacht jQuery 1.7.1 diesen Fehler nicht, es ist neu mit etwas, das sich in 1.7.2 geändert hat.
– Chris Tavares
4. Juni 12 um 18:20 Uhr
Das erklärt sicherlich alle Blogbeiträge über die Verwendung von jQuery mit Metro, ohne dass jemand Probleme hat. Sie wurden hauptsächlich geschrieben, als sich VS12 in der Entwicklungsvorschau befand (veröffentlicht am 16. September 2011), vor jQuery 1.7.2 (veröffentlicht am 21. März 2012).
– Patridge
6. Juni 12 um 13:11 Uhr
Seltsam – Ich habe es gerade mit der neuen Release Preview-Version von Win8 und jQuery 1.7.2 versucht, und alles hat einfach funktioniert, kein Sicherheitsfehler. Hier geht etwas Seltsames vor…
– Chris Tavares
6. Juni 12 um 17:57 Uhr
Adam, bekommst du eine First-Chance-Ausnahme oder eine unbehandelte Ausnahme? Wenn Sie im Dialogfeld des Debuggers auf „Fortfahren“ klicken, stirbt die App oder wird sie weiter ausgeführt? Wenn es weiterhin ausgeführt wird, ist es eigentlich kein Problem, es ist nur eine behandelte Ausnahme. Wenn die App stirbt, dann passiert etwas anderes.
Das Projekt wird “beendet”, weil seine Autoren sagen, dass das Problem von jQuery 2.0 behoben wurde; Das Problem tritt jedoch weiterhin mit jQuery 2.1.0 und VisualStudio 2013 auf …
– Bambus
7. Februar 14 um 9:02 Uhr
Tatsächlich tritt das Problem bei jQuery 2.0.2 nicht auf, also scheint es eine Regression zwischen 2.0.2 und 2.1.0 zu geben
– Bambus
7. Februar 14 um 9:17 Uhr
Das Problem bleibt in jQuery 2.2.4 und 3.1.0 bestehen, bei WP8-Apps sind keine append()-Operationen möglich.
– andreszs
14. August 16 um 21:17 Uhr
Rob M.
Für das, was es wert ist, habe ich den Großteil des jQuery-Kerns portiert, um die native WinJS-Bibliothek zu umschließen. Es ist leicht und bietet fast alles, was jQuery tut, mit dem Hinzufügen einiger Plugins für Abzeichen, Benachrichtigungen usw.
Es ist noch in Arbeit, aber ich versuche, einige Leute dazu zu bringen, sich dem Spaß anzuschließen.
Ja, ich habe es für die Windows 8-App von Answers.com verwendet; Haben Sie spezielle Probleme mit der Bibliothek?
– Rob M.
11. Juni 13 um 22:58 Uhr
Nach dem letzten //Build/ 2012 Konferenz u dieses Gespräch spricht über die Verwendung von jQuery in Windows 8 Store Apps. Insbesondere sprechen sie über die genaue Ausnahme von Skriptinjektion Innerhalb innerHTMLund sprechen Sie über die darin vorgenommenen Aktualisierungen.
Das Unternehmen Anhängen ebenfalls offiziell vorgestellt jQuery für Windows 8 während dieses Gesprächs. Es sieht ordentlich aus der Demonstration, die im Vortrag im Link darüber gegeben wurde.
Sie sagen auch, dass es keine gute Idee ist, jQuery von CDN für Windows 8-Apps im lokalen Kontext zu erhalten!
Der JavaScript Dynamic Content-Shim auf GitHub wurde von Microsoft Open Technologies erstellt und veröffentlicht, um diesen Fehler zu beheben. Es wurde nicht mit jQuery getestet, wird aber höchstwahrscheinlich Ihr Problem lösen. Verweisen Sie auf die Datei winstore-jscompat.js am Anfang Ihrer App, bevor andere Skripts ausgeführt werden, und Sie sollten diesen Fehler nicht mehr sehen.
Danke. Dies funktioniert ordnungsgemäß mit AngularJS, daher gehe ich davon aus, dass es auch mit jQuery funktionieren wird.
– Dwettstein
29. Juli 15 um 10:29 Uhr
Danke!! Ich würde Ihre Antwort 10 Mal positiv bewerten, wenn ich könnte, dies ist wirklich die endgültige Lösung für das Windows-Problem. Jetzt kann ich jQuery 2.x normal verwenden. Ich habe Stunden damit verschwendet, mich nach einer Lösung umzusehen, danke. Ich werde dich jetzt für alles abstimmen.
– andreszs
14. August 16 um 21:29 Uhr
Chris Tavares
Ich habe ein wenig mehr Nachforschungen angestellt und wollte ein paar Dinge klarstellen.
Der angezeigte Fehler tritt in der JavaScript-Konsole auf und ist keine tatsächliche Ausnahme. Der jQuery-Code wird weiter ausgeführt Alles gut. Es ist eigentlich etwas, das das zugrunde liegende System protokolliert, kein Fehler oder Ausnahme.
Es gibt keinen Grund, jQuery zu patchen oder irgendetwas anderes zu tun – es ist eine laute Systemkomponente, kein tatsächlicher Fehler.
Danke. Dies funktioniert ordnungsgemäß mit AngularJS, daher gehe ich davon aus, dass es auch mit jQuery funktionieren wird.
– Dwettstein
29. Juli 15 um 10:29 Uhr
Danke!! Ich würde Ihre Antwort 10 Mal positiv bewerten, wenn ich könnte, dies ist wirklich die endgültige Lösung für das Windows-Problem. Jetzt kann ich jQuery 2.x normal verwenden. Ich habe Stunden damit verschwendet, mich nach einer Lösung umzusehen, danke. Ich werde dich jetzt für alles abstimmen.
Laden Sie jquery über ein cdn?
– Lukuma
2. Juni 12 um 3:35 Uhr
Nein. Dies ist ein Fehler, der bei der Ausführung des lokalen jQuery-Codes ausgelöst wird.
– Patridge
2. Juni 12 um 4:21 Uhr
Nebenbei bemerkt sieht es so aus, als könnte ich a lernen neues Versprechungssystem anstelle von jQuery
$.Deferred
.– Patridge
2. Juni 12 um 4:28 Uhr
jQuery 1.8 benötigt zwei weitere Modifikationen, um einwandfrei mit Windows 8 zusammenzuarbeiten. Ich habe a geschrieben Blogeintrag das die notwendigen Änderungen behandelt, einige Hintergrundinformationen liefert und eine “gepatchte” Version von jQuery 1.8 bereitstellt.
– David Müller
28. August 2012 um 14:16 Uhr
Hier ist eine gute Ressource für die Verwendung von jQuery unter Windows 8: incloud.de/2012/08/windows-8-using-jquery-for-app-development
– Nate Radebaugh
2. November 12 um 15:06 Uhr