首页 文章

WebBrowser控件和JavaScript错误

提问于
浏览
20

当我使用浏览器(ie9)访问页面时,浏览器呈现正常 .

当我使用WebBrowser控件时,我有JavaScript错误 .

我知道我可以抑制脚本错误,但我希望它们能够正确运行,因为它们会影响页面的呈现和功能 .

我怎么解决这个问题 ?我可以直接在Windows窗体中集成IE9,并使用类似于WebBrowser控件的方法(导航,获取ID,调用点击)?

谢谢 .

6 回答

  • 8

    我要做的是将一个对象分配给webbrowser.ObjectForScripting,然后注入一个javascript函数,将windown.onerror分配给一个调用主机应用程序中的外部脚本的包装器 . 喜欢:

    window.onerror = function(message, url, lineNumber) 
    { 
      window.external.errorHandler(message, url, lineNumber);
    }
    

    参考:http://notions.okuda.ca/2009/06/11/calling-javascript-in-a-webbrowser-control-from-c/

  • 7

    您可以使用以下代码行来消除这些类型的错误:

    webBrowser1.ScriptErrorsSuppressed = true;
    

    它可以防止出现JavaScript错误 .

  • 4

    如果安装了IE9,WebBrowser仍将使用IE7模式,除非您使用注册表设置覆盖此行为 - 如StackOverflow answer中所述 . 这是您在IE9中看不到相同错误的JavaScript错误的最可能原因 .

    您可以使用以下c#代码进行注册表设置(如果检测到Windows 8,则设置IE10模式)并更改app-name.exe以匹配您自己的应用程序 . 您应该为没有足够权限的情况添加错误处理程序(写入此注册表项需要管理员权限) .

    string installkey = @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
    string entryLabel = "app-name.exe";
    System.OperatingSystem osInfo = System.Environment.OSVersion;
    
    string version = osInfo.Version.Major.ToString() + '.' + osInfo.Version.Minor.ToString();
    uint editFlag = (uint)((version == "6.2") ? 0x2710 : 0x2328); // 6.2 = Windows 8 and therefore IE10
    
    RegistryKey existingSubKey = Registry.LocalMachine.OpenSubKey(installkey, false); // readonly key
    
    if (existingSubKey.GetValue(entryLabel) == null)
    {
         existingSubKey = Registry.LocalMachine.OpenSubKey(installkey, true); // writable key
         existingSubKey.SetValue(entryLabel, unchecked((int)editFlag), RegistryValueKind.DWord);
    }
    
  • 9

    所以我知道这篇文章很老,但这对我来说是一个最近的问题,我不得不在盒子外面进行一些认真的挖掘和思考 .

    基本上像这里的大多数回复 - 你不能改变webbrowser控件使用最新的IE引擎 . 我默认使用IE7,我看到一些回复基本上改变/添加到注册表的东西,在注册表时总是不舒服,解决这个问题的一个更简洁的方法是在你的网站上附加强制它的代码在任何一台电脑上使用最新的IE引擎,就像一个魅力 .

    如果您有权访问要浏览的页面的web.config文件,则简单追加:

    <system.webServer>
    <httpProtocol>
        <customHeaders>
            <clear />
            <add name="X-UA-Compatible" value="IE=edge" />
        </customHeaders>
    </httpProtocol>
    </system.webServer>
    

    并且您的站点将强制webbrowser控件在您的计算机上运行最新的IE引擎 . 其他选项可在此处找到:

    https://www.leapinggorilla.com/Blog/Read/1016/ie-ate-my-css---disabling-compatability-mode

    我应该声明,只有当您可以访问您尝试访问的网站/应用程序的page / web.config时,这才有效 - 这就是我的情况 .

  • 2

    WebBrowser 控件使用IE7 . 因此,如果出现问题,那么您的脚本不能用于IE7,您必须解决这个问题 .

    你不能集成IE9,因为它取决于它安装在计算机上,并不是每个人都安装了IE9 .

  • 14

    作为对其他人可能有这个问题的帮助,我尝试了所有这些东西,但对我来说没有任何作用 . 这是什么工作 . 我不确定是什么原因导致此错误,但显然当您在VS中按"F5"来调试您的应用程序时,它会运行YourProject.vshost.exe作为进程名称 . 如果从命令行运行相同的应用程序,它将显示为YourProject.exe,并且javascript错误消失 . 我认为IE看到应用程序通过VSHOST运行签证,并决定这是可疑的,并禁用正确加载的JavaScript .

    所以......进入你的可执行文件的项目设置 . 选择“调试”选项 . 选择“启动外部程序” . 浏览并选择Debug \ YourProgram.exe(NOT YourProgram.vshost.exe) . 保存,重新编译,然后点击F5 .

    现在一切都应该按照惯例工作,Visual Studio甚至会自动为您处理这个过程 .

    请享用!

    Grego

相关问题