سؤال

أنا أستضيف عنصر تحكم في متصفح الويب، والذي عادةً ما يقوم بتحميل مستندات خارجية، ثم يجري بعض التعديلات باستخدام HTML DOM.

نقوم أيضًا بتضمين روابط تطبيقات مخصصة باستخدام بروتوكول مزيف، مثل "إغلاق هذا" الذي يتم اكتشافه والتعامل معه BeforeNavigate2.

عند وجود خطأ إملائي في هدف الارتباط (على سبيل المثال، "spp:CloseWindow")، لن يقوم BeforeNavigate بتشغيل المعالجة المخصصة.لا يُظهر عنصر تحكم المستعرض خطأ في التنقل، ولكنه يظل في حالة READYSTATE_INTERACTIVE ولا يطلق رسالة NavigateComplete أو DocumentComplete.


مشكلتي:معظم العمليات (على سبيل المثال.استرجاع أو تحديث المحتويات) يتأخر وينتظر وصول حالة الاستعداد READYSTATE_COMPLETE.بعد النقر على هذا الرابط غير الصالح، لا يتم تحديث المتصفح بعد الآن - وهي حالة أود تجنبها.كيف أقوم بذلك؟

  • هل يمكنني اكتشاف فشل التنقل في "DownloadComplete"؟(حتى أتمكن من تخفيف الاختبار ل "READYSTATE_COMPLETE أو READYSTATE_INTERACTIVE and last downloadComplete was broken")
  • هل يمكنني "إعادة ضبط" عنصر تحكم المتصفح على READYSTATE_COMPLETE (ربما لا)
  • هل يمكنني اكتشاف البروتوكولات الزائفة التي يدعمها المتصفح بالفعل؟

(بعد فوات الأوان، باستخدام xxxx: لم تكن البادئة فكرة جيدة، ولكن تغييرها الآن يمثل مشكلة كبيرة.)

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

المحلول

أعتقد أن Internet Explorer وWindows لديهما قائمة موسعة من البروتوكولات المتاحة المطبقة في UrlMon.dll.انظر هنا قليلا عن هندسة معمارية آي إي.

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

ومع ذلك، هناك طريقة لاكتشاف متى انتهت عملية الملاحة في الأعشاب الضارة.إذا قمت بالاتصال بحدث DocumentCompleted الخاص بمتصفح الويب، فيمكنك البحث عن عناوين URL معينة مرتبطة بالأخطاء، أو بشكل عام، أي شيء له عنوان URL يبدأ بـ res://ieframe.dll.

أمثلة:

  • res://ieframe.dll/unknownprotocol.htm#spp:CloseWindow
  • الدقة://ieframe.dll/dnserrordiagoff_webOC.htm#http://192...

الطريقة الأنظف هي ربط NavigateError الخاص بـ واجهة DWebBrowserEvents2.

نصائح أخرى

واجهتنا مشكلة عند استضافة عنصر تحكم متصفح الويب (خرائط جوجل) حيث سيتم إعلامنا بأن التنقل قد اكتمل (NavigateComplete)، إلا أن صفحة الويب نفسها لم تنتهي من العرض.لإصلاح هذه المشكلة، أضفنا أ notifyInitialised وظيفة javascript التي انتقلت ببساطة إلى "app://onInitialised" - وهي آلية مماثلة تستخدمها.

ربما يمكنك القيام بشيء كهذا (إذا كان لديك سيطرة على الصفحات التي ينتقل إليها المستخدم).يمكنك إضافة آلية الإشعارات هذه والتحقق منها في الكود الخاص بك.إذا لم يتم استلامها بعد انتهاء المهلة المحددة، فيمكنك افتراض حدوث خطأ ما وعرض رسالة ذات صلة.

إذا كنت مهتمًا، فقد استخدمنا أيضًا آلية لاستدعاء وظائف جافا سكريبت مباشرةً من كود C++ الموضح لدينا هنا و هنا.

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