سؤال

لقد حاولت هذا:

string newScript = textBox1.Text;
HtmlElement head = browserCtrl.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = browserCtrl.Document.CreateElement("script");
lblStatus.Text = scriptEl.GetType().ToString();
scriptEl.SetAttribute("type", "text/javascript");
head.AppendChild(scriptEl);
scriptEl.InnerHtml = "function sayHello() { alert('hello') }";

يعطي كل من scriptEl.InnerHtml وscriptEl.InnerText أخطاء:

System.NotSupportedException: Property is not supported on this type of HtmlElement.
   at System.Windows.Forms.HtmlElement.set_InnerHtml(String value)
   at SForceApp.Form1.button1_Click(Object sender, EventArgs e) in d:\jsight\installs\SForceApp\SForceApp\Form1.cs:line 31
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

هل هناك طريقة سهلة لإدخال البرنامج النصي في dom؟

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

المحلول

لسبب ما لم ينجح حل ريتشارد من جهتي (فشلinsertAdjacentText مع استثناء).ولكن يبدو أن هذا يعمل:

HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
element.text = "function sayHello() { alert('hello') }";
head.AppendChild(scriptEl);
webBrowser1.Document.InvokeScript("sayHello");

هذه الإجابة يشرح كيفية الحصول على IHTMLScriptElement واجهة في مشروعك.

نصائح أخرى

HtmlDocument doc = browser.Document;
HtmlElement head = doc.GetElementsByTagName("head")[0];
HtmlElement s = doc.CreateElement("script");
s.SetAttribute("text","function sayHello() { alert('hello'); }");
head.AppendChild(s);
browser.Document.InvokeScript("sayHello");

(تم الاختبار في تطبيق ‎.NET 4 / Windows Forms)

يحرر:تم إصلاح مشكلة الحالة في مجموعة الوظائف.

إليك أسهل طريقة وجدتها بعد العمل على هذا:

string javascript = "alert('Hello');";
// or any combination of your JavaScript commands
// (including function calls, variables... etc)

// WebBrowser webBrowser1 is what you are using for your web browser
webBrowser1.Document.InvokeScript("eval", new object[] { javascript });

ما هي وظيفة جافا سكريبت العالمية eval(str) يقوم بتحليل وتنفيذ كل ما هو مكتوب في الشارع.يفحص w3schools المرجع هنا.

أيضًا، في .NET 4 يكون هذا أسهل إذا كنت تستخدم الكلمة الأساسية الديناميكية:

dynamic document = this.browser.Document;
dynamic head = document.GetElementsByTagName("head")[0];
dynamic scriptEl = document.CreateElement("script");
scriptEl.text = ...;
head.AppendChild(scriptEl);

إذا كان كل ما تريده حقًا هو تشغيل جافا سكريبت، فسيكون هذا أسهل (VB .Net):

MyWebBrowser.Navigate("javascript:function foo(){alert('hello');}foo();")

أعتقد أن هذا لن "يحقنه" ولكنه سيعمل على تشغيل وظيفتك، إذا كان هذا هو ما تبحث عنه.(فقط في حالة المبالغة في تعقيد المشكلة.) وإذا كان بإمكانك معرفة كيفية الحقن في جافا سكريبت، فضع ذلك في نص الدالة "foo" ودع جافا سكريبت يقوم بالحقن نيابةً عنك.

لا يقوم برنامج التضمين المُدار لمستند HTML بتنفيذ الوظائف التي تحتاجها بشكل كامل، لذلك تحتاج إلى التعمق في واجهة برمجة تطبيقات MSHTML لإنجاز ما تريد:

1) قم بإضافة مرجع إلى MSHTML، والذي من المحتمل أن يسمى "مكتبة كائنات Microsoft HTML" ضمن كوم مراجع.

2) إضافة "باستخدام MSHTML ؛" إلى مساحات الأسماء الخاصة بك.

3) احصل على مرجع لعنصر IHTMLElement الخاص بعنصر البرنامج النصي:

IHTMLElement iScriptEl = (IHTMLElement)scriptEl.DomElement;

4) قم باستدعاء الأسلوب InsertAdjacentText، مع قيمة المعلمة الأولى "afterBegin".يتم سرد كافة القيم الممكنة هنا:

iScriptEl.insertAdjacentText("afterBegin", "function sayHello() { alert('hello') }");

5) ستتمكن الآن من رؤية الكود الموجود في خاصية scriptEl.InnerText.

HTH ، ريتشارد

في إطار المتابعة ل إجابة مقبولة, ، هذا هو الحد الأدنى من تعريف IHTMLScriptElement واجهه المستخدم والذي لا يتطلب تضمين مكتبات أنواع إضافية:

[ComImport, ComVisible(true), Guid(@"3050f28b-98b5-11cf-bb82-00aa00bdce0b")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
[TypeLibType(TypeLibTypeFlags.FDispatchable)]
public interface IHTMLScriptElement
{
    [DispId(1006)]
    string text { set; [return: MarshalAs(UnmanagedType.BStr)] get; }
}

لذلك سيبدو الكود الكامل داخل فئة مشتقة من عنصر تحكم WebBrowser كما يلي:

protected override void OnDocumentCompleted(
    WebBrowserDocumentCompletedEventArgs e)
{
    base.OnDocumentCompleted(e);

    // Disable text selection.
    var doc = Document;
    if (doc != null)
    {
        var heads = doc.GetElementsByTagName(@"head");
        if (heads.Count > 0)
        {
            var scriptEl = doc.CreateElement(@"script");
            if (scriptEl != null)
            {
                var element = (IHTMLScriptElement)scriptEl.DomElement;
                element.text =
                    @"function disableSelection()
                    { 
                        document.body.onselectstart=function(){ return false; }; 
                        document.body.ondragstart=function() { return false; };
                    }";
                heads[0].AppendChild(scriptEl);
                doc.InvokeScript(@"disableSelection");
            }
        }
    }
}

هذا هو الحل باستخدام mshtml

IHTMLDocument2 doc = new HTMLDocumentClass();
doc.write(new object[] { File.ReadAllText(filePath) });
doc.close();

IHTMLElement head = (IHTMLElement)((IHTMLElementCollection)doc.all.tags("head")).item(null, 0);
IHTMLScriptElement scriptObject = (IHTMLScriptElement)doc.createElement("script");
scriptObject.type = @"text/javascript";
scriptObject.text = @"function btn1_OnClick(str){
    alert('you clicked' + str);
}";
((HTMLHeadElementClass)head).appendChild((IHTMLDOMNode)scriptObject);

أعتقد أن الطريقة الأكثر بساطة لإدخال Javascript في مستند HTML للتحكم في WebBrowser من c# هي استدعاء طريقة "execStrip" مع الكود الذي سيتم حقنه كوسيطة.

في هذا المثال، يتم إدخال كود جافا سكريبت وتنفيذه على النطاق العالمي:

var jsCode="alert('hello world from injected code');";
WebBrowser.Document.InvokeScript("execScript", new Object[] { jsCode, "JavaScript" });

إذا كنت تريد تأخير التنفيذ، فأدخل الوظائف واستدعها بعد:

var jsCode="function greet(msg){alert(msg);};";
WebBrowser.Document.InvokeScript("execScript", new Object[] { jsCode, "JavaScript" });
...............
WebBrowser.Document.InvokeScript("greet",new object[] {"hello world"});

وهذا صالح لعناصر تحكم Windows Forms وWPF WebBrowser.

هذا الحل ليس عبر المتصفحات لأن "execScript" محدد فقط في IE وChrome.لكن السؤال يدور حول عناصر تحكم Microsoft WebBrowser وIE هو الوحيد المدعوم.

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

var jsCode="alert('hello world');";
(new Function(code))();

بالطبع يمكنك تأخير التنفيذ:

var jsCode="alert('hello world');";
var inserted=new Function(code);
.................
inserted();

نأمل أن يساعد

انا استخدمت هذا :د

HtmlElement script = this.WebNavegador.Document.CreateElement("SCRIPT");
script.SetAttribute("TEXT", "function GetNameFromBrowser() {" + 
"return 'My name is David';" + 
"}");

this.WebNavegador.Document.Body.AppendChild(script);

ثم يمكنك التنفيذ والحصول على النتيجة باستخدام:

string myNameIs = (string)this.WebNavegador.Document.InvokeScript("GetNameFromBrowser");

آمل أن أكون مفيدا

فيما يلي مثال VB.Net إذا كنت تحاول استرداد قيمة متغير من داخل صفحة تم تحميلها في عنصر تحكم WebBrowser.

الخطوة 1) أضف مرجع COM في مشروعك إلى مكتبة كائنات Microsoft HTML

الخطوة 2) بعد ذلك، أضف كود VB.Net هذا إلى Form1 الخاص بك لاستيراد مكتبة mshtml:
استيراد MSHTML

الخطوة 3) أضف كود VB.Net هذا أعلى سطر "Public Class Form1":
<System.Runtime.InteropServices.ComVisibleAttribute(True)>

الخطوة 4) إضافة عنصر تحكم WebBrowser إلى مشروعك

الخطوة 5) أضف كود VB.Net هذا إلى وظيفة Form1_Load الخاصة بك:
WebBrowser1.ObjectForScripting = أنا

الخطوة 6) أضف هذا VB.Net الفرعي الذي سيُدخل وظيفة "CallbackGetVar" في Javascript لصفحة الويب:

Public Sub InjectCallbackGetVar(ByRef wb As WebBrowser)
    Dim head As HtmlElement
    Dim script As HtmlElement
    Dim domElement As IHTMLScriptElement

    head = wb.Document.GetElementsByTagName("head")(0)
    script = wb.Document.CreateElement("script")
    domElement = script.DomElement
    domElement.type = "text/javascript"
    domElement.text = "function CallbackGetVar(myVar) { window.external.Callback_GetVar(eval(myVar)); }"
    head.AppendChild(script)
End Sub

الخطوة 7) أضف VB.Net الفرعي التالي والذي سيبحث عنه Javascript عند استدعائه:

Public Sub Callback_GetVar(ByVal vVar As String)
    Debug.Print(vVar)
End Sub

الخطوة 8) أخيرًا، لاستدعاء رد اتصال Javascript، أضف رمز VB.Net هذا عند الضغط على زر، أو في أي مكان تريد:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    WebBrowser1.Document.InvokeScript("CallbackGetVar", New Object() {"NameOfVarToRetrieve"})
End Sub

الخطوة 9) إذا تفاجأت بنجاح هذا الأمر، فقد ترغب في قراءة وظيفة "التقييم" في Javascript، المستخدمة في الخطوة 6، وهو ما يجعل ذلك ممكنًا.سوف يستغرق الأمر سلسلة ويحدد ما إذا كان هناك متغير بهذا الاسم، وإذا كان الأمر كذلك، فسيتم إرجاع قيمة هذا المتغير.

يمكنك دائمًا استخدام خاصية "DocumentStream" أو "DocumentText".للعمل مع مستندات HTML أوصي بـ حزمة أجيليتي HTML.

ما تريد القيام به هو استخدام page.registerStartupScript (مفتاح ، نص):

انظر هنا لمزيد من التفاصيل: http://msdn.microsoft.com/en-us/library/aa478975.aspx

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

يحرر:هذا هو ما تسمونه الزناد سعيدا.لا تتردد في أسفله.:)

انا استعمل هذا:

webBrowser.Document.InvokeScript("execScript", new object[] { "alert(123)", "JavaScript" })

إذا كنت بحاجة إلى حقن ملف كامل، فيمكنك استخدام هذا:

With Browser.Document
   Dim Head As HtmlElement = .GetElementsByTagName("head")(0)
   Dim Script As HtmlElement = .CreateElement("script")
   Dim Streamer As New StreamReader(<Here goes path to file as String>)
   Using Streamer
       Script.SetAttribute("text", Streamer.ReadToEnd())
   End Using
   Head.AppendChild(Script)
   .InvokeScript(<Here goes a method name as String and without parentheses>)
End With

تذكر أن تستورد System.IO من أجل استخدام StreamReader.آمل أن يساعد هذا.

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