【问题标题】:Can I use WebBrowser.Document.InvokeScript on a JavaScript function NOT defined in the header element?我可以在标头元素中未定义的 JavaScript 函数上使用 WebBrowser.Document.InvokeScript 吗?
【发布时间】:2023-03-14 16:04:01
【问题描述】:

对于我可能使用的任何用词不当,我立即道歉。

我有一系列由 PHP 生成的网页,我正在使用 WebBrowser 控件进行操作。这些页面定义了隐藏在正文中的 JavaScript 函数(这对我来说很愚蠢,我没有编写它们,我只需要使用它们)。

是否可以使用 Document.InvokeScript 方法来访问这些函数,如果不能,我该怎么做才能访问它们?

【问题讨论】:

    标签: c# php javascript .net-4.0 webbrowser-control


    【解决方案1】:

    Windows 窗体的实现使用 IDispatch.GetIDsOfNames 在 top level named items 的 script engine 中查找函数名称的完全匹配。对于 active script interfaces 的 MSHTML 的 JScript 实现,顶级命名项目是

    您实际上并不需要将新的命名项添加到脚本引擎(如果您真的愿意,可以通过 IDispatchEx 进行),例如使用现有的命名项执行代码的方法有很多

    • 来自 jscript 全局变量的 eval 函数
    • 来自窗口对象的execScript函数
    • 来自窗口对象的setTimeout函数

    您可以使用上述之一作为脚本方法的名称,以在 HtmlDocument.InvokeScript 中调用并在附加参数中传递代码。

    【讨论】:

      【解决方案2】:

      是的 - JavaScript 中的所有函数都可以同等访问。

      注意事项

      • 某些 JavaScript 文件可能不会很早就加载 - 您需要正确等待(文档准备好/完成,或页面自定义通知/简单超时),直到加载所有脚本。
      • 可以将 JavaScript 函数设置为“私有” - 在 JavaScript 中使用 window.FuncitionName(...) 无法调用 - 您也无法通过 InvokeScript 调用此类函数。

      下面这种“私有”函数的示例:

      $(function(){  
         ....
         function MyHiddenFunction() {
           // you can't call be from outside!!!!
         }
      });
      

      【讨论】:

      • 那么这可以解释为什么当我尝试直接与加载到 webbrowser 控件中的网页交互时,我得到一个 javascript 错误?因为功能尚未加载并且“不存在”?如果它们位于标题中,它们会加载更快吗?
      • 不知道你的页面为什么会失败。至于在 HEAD 中引用 JavaScript 文件/添加 JavaScript:JavaScript 已按照它们在文档中显示的顺序进行解析,所以是的 - 一旦在 HEAD 中将很早就加载。
      【解决方案3】:

      我找到了答案(发生了一些事情,我无法再访问我的帐户,所以如果有人也能回答我,那就太好了)但答案是这样的: WebBrowser 使用的是 IE7,而 IE7 就是一坨屎。

      IE9 执行脚本就好了。 所以我不得不强制它使用IE9

      这是通过使用此处给出的答案完成的:

      WebBrowser control and JavaScript errors

      所以...万岁!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-27
        • 1970-01-01
        • 2015-12-04
        • 2014-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        相关资源
        最近更新 更多