【问题标题】:Executing javascript containing method in WebBrowser control C#在WebBrowser控件C#中执行包含方法的javascript
【发布时间】:2013-06-21 13:20:45
【问题描述】:

我真的需要一些帮助来在 WebBrowser 控件中执行这段 javascript 代码。在网站上,它是这样执行的:

"javascript:setTimeout('__doPostBack(\'dsl50$ct160$g_818f5662_1255_51ab_d4e1_6bse0453e306$ba400$rdProcess$ucTopQuestions$qst_1995\',\'\')', 0)"

我尝试了很多东西,比如:

webBrowser1.Navigate("javascript:setTimeout('__doPostBack(\'dsl50$ct160$g_818f5662_1255_51ab_d4e1_6bse0453e306$ba400$rdProcess$ucTopQuestions$qst_1995\',\'\')', 0)");

但它不起作用。

有人有什么建议吗?

编辑:

也试过这个:

HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
            HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
            IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
            element.text = "function __doPostBack(eventTarget, eventArgument)";
            head.AppendChild(scriptEl);
            webBrowser1.Document.InvokeScript("__doPostBack(\'dsl50$ct160$g_818f5662_1255_51ab_d4e1_6bse0453e306$ba400$rdProcess$ucTopQuestions$qst_1995\',\'\'");

我得到 JS 异常:

EDIT2:

我也做过:

string sa = @"function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}";

element.text = s;

但是什么也没发生,JS 没有被执行。

EDIT3:

也试过了

webBrowser1.Document.InvokeScript(@"__doPostBack(\'dsl50$ct160$g_818f5662_1255_51ab_d4e1_6bse0453e306$ba400$rdProcess$ucTopQuestions$qst_1995\',\'\'");

但是什么也没发生。浏览器应该刷新。以下是浏览器的代码:

<select name="dsl50$ct160$g_818f5662_1255_51ab_d4e1_6bse0453e306$ba400$rdProcess$ucTopQuestions$qst_1995" onchange="javascript:setTimeout('__doPostBack(\'dsl50$ct160$g_818f5662_1255_51ab_d4e1_6bse0453e306$ba400$rdProcess$ucTopQuestions$qst_1995\',\'\')', 0)" id="dsl50$ct160$g_818f5662_1255_51ab_d4e1_6bse0453e306$ba400$rdProcess$ucTopQuestions$qst_1995" class="dropdown" pid="as2ba2d5-d2cc-dad2-9e35-abd345678aac">
                <option value="1 (1)">1</option>
                <option value="2 (2)">2</option>
                <option value="3 (3)">3</option>

            </select>

【问题讨论】:

  • 错误很明显——你错过了一个左大括号!在您的行中“element.text =”function __doPostBack(eventTarget, eventArgument)“;”您已经编写了函数签名但没有函数体。事实上,我认为你根本不需要那一行 - nirmus 展示了如何编写一个函数然后调用它,但该函数应该已经存在(它是用于回发的 ASP.NET 框架代码,对吧?)所以你可以可能会丢失除示例代码的最后一行之外的所有内容,只需执行“webBrowser1.Document.InvokeScript("__doPostBack(\'dsl50$ct160$g_818f5662_1255_51ab_d4e1 etc etc etc etc”);"
  • 也试过了,但是JS没有被执行:(
  • 但是这次没有报错吧?如果是这样,也许 javascript 已执行但没有结果。如果将 InvokeScript 的参数更改为像“alert('hello');”这样的简单参数会发生什么?
  • 页面应该刷新。我正在尝试更改复选框的值,但除非触发 JS,否则不会触发它。所以我使用 webbrowser.setattribute 更改它并使用您的调用脚本,但它不会刷新。
  • 我刚刚注意到您已经转义了该 InvokeScript 参数中的单引号,但没有必要,因为该字符串不再像在原始 javascript 中那样位于单引号内。这大概就是要命了。试试 webBrowser1.Document.InvokeScript("__doPostBack('dsl50$ct160$g_818f5662_1255_51ab_d4e1_6bse0453e306$ba400$rdProcess$ucTopQuestions$qst_1995',''");

标签: c# javascript .net browser


【解决方案1】:

查看此链接:

How to inject Javascript in WebBrowser control?

代码:

    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");

【讨论】:

    【解决方案2】:

    我想你想要:

    string javascriptDoPostBack = @"function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }";
    
    HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
    HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
    element.text = javascriptDoPostBack;
    head.AppendChild(scriptEl);
    
    webBrowser1.Document.InvokeScript("__doPostBack('dsl50$ct160$g_818f5662_1255_51ab_d4e1_6bse0453e306$ba400$rdProcess$ucTopQuestions$qst_1995','');");
    

    【讨论】:

    • 根本没有调用 JavaScript 吗?如果您在 __doPostBack 的第一行添加 alert/console.log 行,那会输出什么吗?
    • 如果我提醒你好但不是 __dPostBack 会被调用
    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多