Erkennen, ob postMessage senden können Objekte?
Ich bin auf der Suche nach eine nette Möglichkeit um zu erkennen, ob postMessage in der browser unterstützt das senden und empfangen von Objekten oder einfach nur strings. Ich vermute, dass jemand da draußen muss etwas schrieb, das dies tut, aber ich habe es nicht geschafft, eine Lösung zu finden.
Bin ich mit postMessage senden von Daten zu/von einem WebWorker. Während Sie erkennen, ob der browser unterstützt die Beschäftigten ist straight-forward, erkennen, ob Objekte können per postMessage hat sich als schwierig erwiesen.
Ich würde gerne schreiben ein einfaches detection-Funktion. Also, wenn der browser unterstützt das versenden von Objekten zu verwenden. Wenn nur strings erlaubt sind kann ich den fallback auf die Verwendung von JSON.stringify(). Ich werde wahrscheinlich weisen Sie die Funktion zu einem dojo/test (das ist zwar nicht relevant für die Frage/Antwort).
Was haben andere Menschen getan, um dieses problem zu lösen? Jede Beratung wäre toll, ich bin neu sowohl für Webworker und postMessage. Vielen Dank im Voraus.
postMessage
das gleiche Fenster?was? Ein WebWorker ist eine Klasse zum erstellen (pseudo-)threads. Grundsätzlich können Sie die Ausführung einer externen javascript-Datei, während das javascript in die Seite weiterhin läuft einwandfrei.
postMessage
ermöglicht Ihnen die Kommunikation mit diesem thread. Es nicht zu tun hat, mit verschiedenen windows überhaupt.Dein Erster Satz spricht über das senden von Nachrichten mit
postMessage
. Ich schaue postMessage
und er spricht über das senden von Nachrichten an andere windows (soweit ich mich erinnere). Abgesehen von der Tatsache, dass Sie sprechen, Web-worker, warum würden Sie nicht einfach einen test nennen? Ich vermute, Ihre Kommunikation ist anders, aber wenn Sie ein Zuhörer im aktuellen Fenster für onmessage
und pass in {}
...einfach mal die typeof
zu sehen, ob es ein Objekt und kein string.InformationsquelleAutor Stephen Simpson | 2012-12-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich sogar noch einfacher zu erkennen, ob postMessage unterstützt nur strings, oder wenn es unterstützt auch andere Arten. Fügen Sie einfach eine benutzerdefinierte toString-Methode auf das Objekt. Wenn Sie versuchen, ein Objekt senden mit postMessage im IE8 und IE9 werden Sie konvertiert einen string mit der toString-Methode auf das Objekt. Da Browser, die das unterstützen, senden von Objekten nicht nennen toString können wir dies zu unserem Vorteil nutzen. Dieser test ist nicht async, so erhalten Sie sofort das Ergebnis. Noch nicht getestet mit web-workers, aber ich nehme an, Sie können das gleiche Verfahren verwenden.
Getestet in IE8, IE9, IE10 und neueste version von Chrome, Firefox, Safari und Opera:http://jsbin.com/igowoFaj/1/edit?js,Konsole
Update: Habe eine BrowserScope test viele weitere tests und Browser. Fazit ist, dass es ist sicher zu senden clonable Objekte, arrays, zahlen, pixel-Daten und array-Puffer, wenn
onlyStrings
istfalse
. In der Theorie alle Browser erlauben das senden von Objekten sollten die strukturierte Klon-Algorithmus, aber der Android-browser und Opera Mobile hat Macken. Die BrowserScope test-Ergebnis ist ein bisschen schwer zu Lesen, da steht eine 0 für send_xxx ist nur problematisch, wenn der browser tatsächlich hat die Unterstützung für diesen Typ, so überprüfen Sie supports_xxx zu. Wenn Sie gleich sind, ist es ok, aber es ist ein Fehler, wenn der browser zu unterstützen, kann aber nicht senden (wenn onlyStrings ist false).InformationsquelleAutor gregers
Wollte ich wissen, die gleiche Sache. Ich habe dieses Skript zu erkennen, ob ein Objekt weitergegeben werden konnten im postMessage durch einen Rückruf auf das aktuelle Fenster. Sie werden sehen, IE 9 false zurück, also 10 den Wert true zurück.
http://jsfiddle.net/milesplit/DvqqH/
InformationsquelleAutor Jason Byrne
Könnten Sie versuchen, eine Aktion durchzuführen, BEVOR ein neuer Ihr Skript. Sie könnten versuchen, diese:
dummy_task.js
javascript
InformationsquelleAutor Tim S.
postMessage
funktioniert auch zwischeniframe
s; unter der Annahme, dass das Verhalten identisch ist, zwischen Arbeitnehmern und frames, Sie sollten versuchen, die folgenden oder ähnliches:Müssen Sie möglicherweise zu ersetzen, console oder console.anmelden in der Lage sein, um Ergebnisse zu sehen, aber auf Chrome, das wird mir
wenn ich speichern Sie es in eine lokale Datei und öffnen Sie es.
Die jsfiddle-version (und die version, die mit einem tatsächlichen Arbeitnehmer) werden Links als eine übung für den Leser.
:)
InformationsquelleAutor ellisbben