محاولة تعيين/الحصول على متغير JavaScript في ActiveX WebBrowser من C#

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

سؤال

لدينا تطبيق Windows يحتوي على عنصر تحكم ActiveX WebBrowser.كجزء من التشغيل المنتظم لهذا التطبيق، يتم إجراء تعديلات على الصفحات التي يتم عرضها بواسطة عنصر تحكم ActiveX WebBrowser.يتضمن جزء من هذه التعديلات تعيين متغير JavaScript في صفحة ويب يتم تحميلها في ActiveX WebBrowser.

نحن بحاجة إلى تهيئة هذا المتغير داخل C# (في الأصل، كان كود VB6 يقوم بتهيئة القيمة).قيمة هذا المتغير هي كائن فئة COM مرئية.

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

<HTML>
 <HEAD>
  <TITLE>Test</TITLE>
  <SCRIPT type="text/javascript">
   var field = 'hello world';
  </SCRIPT>
 </HEAD>
 <BODY>
   <input type="button" value="See field" onclick="javascript:alert(field);"/>
 </BODY>
</HTML>

نريد الوصول إلى مجال متغير وتعيين قيمة له.في VB6 كان الكود الخاص بذلك واضحًا جدًا:

doc.Script.field = 'newValue'

ومع ذلك، في C# كان علينا اللجوء إلى حيل أخرى، مثل هذا:

Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);

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

يعمل هذا في المرة الأولى، لكنه لا يعمل إذا قمنا بإعادة تحميل الصفحة.في المكالمات اللاحقة لا يمكننا تعيين قيمة المتغير field.

هل لدى أي شخص أي خبرة في القيام بهذا النوع من العمليات من قبل؟

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

المحلول 3

ساعدتنا هاتان المقالتان في إيجاد حل لمشكلتنا.وهي تحدد أساسيات ما يحتاج المرء إلى معرفته:

أتمتة متصفح الويب من Microsoft باستخدام C#

استخدام واجهات الاستضافة المتقدمة MSHTML

لذلك قمنا بتنفيذ واجهة DocHostUIHandler مما سمح لنا بتعيين UIHandler، مما يسمح لنا بالرجوع إلى الطريقة من Javascript.

نصائح أخرى

أعتقد أن ما تبحث عنه هو eval() الطريقة في جافا سكريبت.يمكنك تسميتها من C# مثل هذا:

webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});

سيتم تقييم هذا الرمز "1 + 2" والعودة "3".أتصور أنه إذا كنت ستضعه

InvokeScript("eval", new String[] {"varName = 3"})

ستحصل على هذا المتغير المعين لـ 3 إذا كان مرئيًا عالميًا في الملف.

إذا كنت تستخدم عنصر تحكم WebBrowser ، فيمكنك تعيين كائن AC# إلى خاصية ObjectForScriptinghttp://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx

بعد ذلك يمكنك استخدام window.external في جافا سكريبت الخاص بك للتفاعل مع كائن C# الخاص بك من جافا سكريبت

إذا كنت تستخدم إصدار ActiveX لسبب ما، فيمكنك تمرير جافا سكريبت:عناوين url لتعيين المتغير الخاص بك برمجيًا، أو يمكنك مزامنة البرنامج النصي الخاص بك باستخدام خدمة ويب/قاعدة بيانات/ملف أو ببساطة باستخدام الطريقة التي اقترحتها.

الطريقة المعتادة التي نستخدمها هي إضافة مربع إدخال نص مخفي (إصدار التحكم ASP.Net) على الصفحة.وبهذه الطريقة يمكنك بسهولة تعيين قيمتها في رمز C# الخلفي وقراءة القيمة في JavaScript من جانب العميل (والعكس صحيح بالطبع).

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