كيف تقوم بتشفير كائن في Web Worker حتى يتم تمريره عبر postMessage؟

StackOverflow https://stackoverflow.com/questions/1402209

سؤال

داخليًا، سيقوم Firefox بترميز JSON للكائن الذي تم تمريره عبر postMessage من وإلى Web Worker.ومع ذلك، فإن هذا يعمل فقط في إصدارات Trunk من Firefox (3.6+) وليس في Firefox 3.5، لذا فإن السؤال هو حقًا كيفية إضافة دعم عكسي لهذه العملية إلى النظام الأساسي الحالي.تم اقتراح التابعين window.atob() و window.btoa() من قبل، لكن للأسف، هذه الأساليب غير متاحة داخليًا للسلاسل لأنها لا تملك إمكانية الوصول إلى DOM.

صرحت موزيلا بذلك علنًا على موقع ويكي المطورين الخاص بها، ولكن لاحظ الكثيرون في المجتمع أن هذا يحدث.تحقق من اختبار مدونة إيجون: http://ejohn.org/files/bugs/postMessage/

لقد تحققت من أن هذا هو الحال أيضًا، ففي الإصدار 3.5، يتم تمرير السلاسل فقط، وفي الإصدار 3.6 سيتم تمرير الكائن.

هل كانت مفيدة؟

المحلول

لم ألاحظ أن تشفير JSON التلقائي لا يعمل في Firefox 3.5، ولكنني كنت أعمل بشكل أساسي مع Gears، الذي لا يدعمه على أي حال.

حاول تضمين أ فائدة JSON في كل من البرنامج النصي العامل والبرنامج النصي الأصلي، ثم قم بتشفيره وفك تشفيره يدويًا بنفسك.هذا يعمل بشكل جيد إلى حد ما بالنسبة لي مع Gears.

لا ينبغي أن ينقطع هذا الأسلوب عندما يبدأ Firefox تلقائيًا في إجراء تشفير JSON نيابةً عنك، نظرًا لأن سلسلة JSON المشفرة ستظل سلسلة.

نصائح أخرى

يوجد في JavaScript وظيفتان على التوالي لفك تشفير سلاسل Base64 وترميزها:

atob() btoa()

لقد وجدت الحل لمشكلتي!

يبدو أنه إذا تم الإعلان عن متغير مؤشر الترابط بشكل عام، فإنه سيفقد الخاصية .onmessage الخاصة به إذا تم الإعلان عن هذه الخاصية المذكورة داخل وظيفة أخرى.إذا تم إنشاء مثيل للخاصية على النطاق العام، فسيتم تحليل رسائل JSON بشكل صحيح.

ما زلت غير متأكد من أنني أفهم ما يحدث هنا، ولكن على الأقل اكتشفت طريقة لتمرير الكائنات دون الحاجة إلى الاعتماد على أي مكتبات stingify/json إضافية.

إذا كان بإمكان أي شخص أن يشرح لي هذا حتى يكون لدي فهم أفضل، فسيكون ذلك موضع تقدير :)

أقوم بإعداد حالة اختبار هنا: http://x.miernicki.com/ الذي يسجل الرسائل البينية إلى وحدة التحكم في Firebug إذا كان أي شخص يهتم.لقد ساعدني هذا في تمرير الكائنات في Fox3.5 وسمح لي في النهاية بمعرفة ماهية المشكلة.

نظرًا لأنك تبحث بوضوح عن حل FF فقط، فهل حاولت ذلك؟ yourObject.toSource()?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top