الملخص
تعيد معاينات ملفات PDF المضمنة باستمرار تعيين موضع التمرير الخاص بها (إلى الصفحة 1) عند التمرير عبر موضوع طويل. يحدث هذا لأن تضمين ملف PDF يتم تدميره وإعادة إدخاله عندما يخرج المنشور عن نطاق العرض، ومن المحتمل أن يكون ذلك بسبب إعادة تدوير / تجسيد تيار المنشورات الخاص بـ Discourse.
يؤثر هذا على جميع المتصفحات، وجميع ملفات PDF، ويحدث حتى مع تعطيل جميع المكونات الإضافية والسمات.
خطوات إعادة الإنتاج
- إنشاء موضوع به مرفق PDF.
- التأكد من أن مكون معاينات ملفات PDF المضمنة نشط.
- التمرير لأسفل عبر الموضوع حتى يخرج المنشور الذي يحتوي على ملف PDF من إطار العرض.
- التمرير مرة أخرى إلى نفس معاينة ملف PDF.
- النتيجة:
- يتم إعادة تحميل ملف PDF من البداية.
- يتم فقدان موضع تمرير المعاينة.
- تتم إعادة عرض ملف PDF كما لو تم تحميله حديثًا.
لا يحدث أي طلب شبكة لملف PDF، مما يشير إلى إزالة عقدة DOM محليًا وإعادة إنشائها.
السلوك المتوقع
- يجب أن تحافظ معاينة ملف PDF على موضع التمرير الخاص بها ويجب ألا تعيد التحميل لمجرد التمرير في الموضوع.
- المحتوى المضمن الآخر (الصور ومقاطع الفيديو وOneboxes) لا يعيد تعيين الحالة عند التمرير؛ يجب أن تتصرف معاينات PDF بشكل متسق.
السلوك الفعلي
- بمجرد خروج المنشور عن النطاق المرئي، يقوم Discourse بإلغاء تحميل عقدة DOM.
- عند عودة المنشور إلى العرض، يتم إعادة بناء التضمين.
- يجبر هذا عارض PDF الأصلي للمتصفح على البدء من جديد من الصفحة 1.
- يحدث هذا في كل مرة يغادر فيها المنشور إطار العرض (لأعلى أو لأسفل).
البيئة
- يحدث في جميع المتصفحات التي تم اختبارها: Chrome وFirefox وSafari وEdge
- يحدث مع تعطيل جميع المكونات الإضافية (الوضع الآمن)
- يحدث مع تعطيل جميع مكونات السمة
- يحدث مع ملفات PDF متعددة بأحجام وتنسيقات مختلفة
- يحدث على أحدث فرع لـ Discourse (tests-passed) (اعتبارًا من تاريخ النشر)
ملاحظات فنية
يبدو أن Discourse يقوم بإلغاء تحميل مكونات المنشورات خارج الشاشة كجزء من تجسيد التيار. نظرًا لأن معاينة ملف PDF تستخدم <iframe> / <embed> بسيطًا، فليس لديها آلية استدامة، لذا يتم إعادة تعيينها بالكامل في كل مرة:
- يتم تشغيل willDestroyElement()
- تتم إعادة عرض حاوية المنشور
- تتم إعادة إنشاء عقدة DOM عند إعادة الدخول إلى إطار العرض
هذا فريد لملفات PDF لأن عارضات PDF الأصلية للمتصفح لا تحافظ على حالة التمرير عبر إعادة بناء DOM.
هذا يجعل المواضيع الطويلة التي تحتوي على ملفات PDF محبطة للقراءة، خاصة بالنسبة للمرفقات متعددة الصفحات.
الحل المطلوب
- منع تدمير مكون المعاينة المضمن لملف PDF أثناء إعادة تدوير المنشور أو
- توفير طريقة للمكونات الإضافية/السمات للإعلان عن “حالة دائمة” حتى لا يقوم Discourse بإلغاء تحميلها
- أو الكشف عن إعداد موقع لتعطيل إعادة تدوير تيار المنشورات للمنشورات التي تحتوي على عارضات PDF مضمنة
حتى الإصلاح الجزئي - على سبيل المثال، تخطي إعادة التدوير للمنشورات التي تحتوي على تضمينات PDF - سيحل المشكلة.
سياق إضافي
هذه ليست مشكلة بيئية لمرة واحدة: لقد تم إعادة إنتاجها بشكل موثوق به في عمليات بناء اختبار نظيفة، ومتصفحات متعددة، وعبر ملفات PDF.
لا توجد مواضيع Meta تصف هذا السلوك، لذلك قد يكون هذا تراجعًا لم يتم الإبلاغ عنه أو نتيجة غير مقصودة لتحسينات تجسيد التيار.