簡體   English   中英

如何在MSHTML中調用腳本

[英]How to invoke scripts work in msHTML

我正在使用axWebBrowser,我需要使腳本工作,當列表框的選定項目更改時,該腳本才能工作。

在默認的webBrowser控件中,有一個類似的方法;

WebBrowserEx1.Document.InvokeScript("script")

但是在axWebBrowser中,我無法使用任何腳本! 並且沒有關於此控件的文檔。

有人知道嗎?

答案較晚,但希望仍然可以對某人有所幫助。 使用WebBrowser ActiveX控件時,有多種方法可以調用腳本。 對於WebBrowser控件的WinForms版本(通過webBrowser.HtmlDocument.DomDocument )和WPF版本(通過webBrowser.Document )也可以使用相同的技術:

void CallScript(SHDocVw.WebBrowser axWebBrowser)
{
    //
    // Using C# dynamics, which maps to COM's IDispatch::GetIDsOfNames, 
    // IDispatch::Invoke
    //

    dynamic htmlDocument = axWebBrowser.Document;
    dynamic htmlWindow = htmlDocument.parentWindow;
    // make sure the web page has at least one <script> tag for eval to work
    htmlDocument.body.appendChild(htmlDocument.createElement("script"));

    // can call any DOM window method
    htmlWindow.alert("hello from web page!");

    // call a global JavaScript function, e.g.:
    // <script>function TestFunc(arg) { alert(arg); }</script>
    htmlWindow.TestFunc("Hello again!");

    // call any JavaScript via "eval"
    var result = (bool)htmlWindow.eval("(function() { return confirm('Continue?'); })()");
    MessageBox.Show(result.ToString());

    //
    // Using .NET reflection:
    //

    object htmlWindowObject = GetProperty(axWebBrowser.Document, "parentWindow");

    // call a global JavaScript function
    InvokeScript(htmlWindowObject, "TestFunc", "Hello again!");

    // call any JavaScript via "eval"
    result = (bool)InvokeScript(htmlWindowObject, "eval", "(function() { return confirm('Continue?'); })()");
    MessageBox.Show(result.ToString());
}

static object GetProperty(object callee, string property)
{
    return callee.GetType().InvokeMember(property,
        BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.Public,
        null, callee, new Object[] { });
}

static object InvokeScript(object callee, string method, params object[] args)
{
    return callee.GetType().InvokeMember(method,
        BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
        null, callee, args);
}

必須至少有一個<script>標記,JavaScript的eval才能正常工作,可以如上所示進行注入。

另外,也可以使用webBrowser.Document.InvokeScript("setTimer", new[] { "window.external.notifyScript()", "1" })webBrowser.Navigate("javascript:(window.external.notifyScript(), void(0))")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM