【问题标题】:Stop alert javascript popup in webbrowser c# control在 webbrowser c# 控件中停止警报 javascript 弹出窗口
【发布时间】:2010-10-03 04:41:17
【问题描述】:

这个网站: http://blog.joins.com/media/folderListSlide.asp?uid=ddatk&folder=3&list_id=9960150

有这个代码:

<script>alert('¿Ã¹Ù¸¥ Çü½ÄÀÌ ¾Æ´Õ´Ï´Ù.');</script>

所以我的网络浏览器控件显示了一个弹出窗口,如何在不使用 sendkeys 输入的情况下绕过弹出窗口??

【问题讨论】:

  • 一行前4个空格将其格式化为代码。为此,请选择行并输入 ctr-k
  • 我很困惑为什么你不能删除或注释掉那一行?
  • 我很抱歉这么说,但是这个问题和@robert 之前的问题都是模糊的 bot-ish。代理;自动提交表格;在没有sendkeys 的情况下抑制浏览器警报。腥。很腥。

标签: c# javascript browser alert


【解决方案1】:

如果您不打算在您的页面上使用 alert() 函数,您也可以直接覆盖它。例如:

<script type="text/javascript">
alert = function(){}
</script>

如果你确实需要使用 JavaScript 的 alert 功能,你可以“重载”它:

<script type="text/javascript">
var fnAlert = alert;
alert = function(message,doshow) {
    if (doshow === true) {
        fnAlert(message);
    }
}
alert("You won't see this");
alert("You will see this",true);
</script>

【讨论】:

  • 我必须“清除”/避免来自 c# 的弹出窗口,我没有访问该网站的代码,只是一个随机网站,它通过弹出窗口阻止了我的整个应用程序
  • 听起来他们不希望您的应用程序访问他们的内容。这是真的吗?
  • nop 只是一个随机页面,我只是发现当 javascriot 独自一人时我无法找到并重写 javascript。如果源代码只有此代码 如何阻止该弹出窗口
  • 你基本上只有两个选择。 1)您通过删除警报语句来修改文档; 2) 通过插入覆盖警报语句的新代码来修改 DOM。听起来选项 1 是不行的,如果你真的不能定位这个特定的站点(如果它实际上是一个“随机站点”,就像你说的那样)。因此,您必须选择选项 2。您可以通过在 &lt;head&gt; 中尽可能高地放置“覆盖”代码来做到这一点,但在任何 &lt;meta&gt; 标记之后。顺便说一句,警报说什么?
  • 我不知道不相关,可以打个招呼
【解决方案2】:

ProgressChanged 事件处理程序中,您插入一个脚本元素,用您自己的函数替换 Javascript alert 函数,该函数什么都不做:

private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
    {
        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
        {
            HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
            HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
            IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
            string alertBlocker = "window.alert = function () { }";
            element.text = alertBlocker;
            head.AppendChild(scriptEl);
        }
    }

为此,您需要在表单中添加对 Microsoft.mshtmluse mshtml; 的引用。

【讨论】:

  • 我推荐这个 answer 用于注入 javascript 的托管解决方案,不需要像 mshtml 那样部署 PIA。
【解决方案3】:

处理 IDocHostShowUI::ShowMessage 并返回 S_OK。 以http://www.codeproject.com/KB/miscctrl/csEXWB.aspx 为例。

【讨论】:

    【解决方案4】:

    给出的解决方案是错误的

    private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
    {
        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
        {
            HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
            HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
            IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
            string alertBlocker = "window.alert = function () { }";
            element.text = alertBlocker;
            head.AppendChild(scriptEl);
        }
    }
    

    似乎处理消息的窗口挂钩是解决方案

    【讨论】:

      【解决方案5】:

      我认为您正在使用 WinForm 应用程序中的 WebBroswer 在其 javascript 中的 alert(xxx) 内导航页面?你可以试试:

      broswer.Navigated += (sender, args) =>
        {
           var document = (sender as WebBrowser).DocumentText;
           //find the alert scripts and remove/replace them
        }
      

      【讨论】:

      • 对不起,我不明白,我必须把那个代码放在哪里??替换我可以使用 WebBrowser1.DocumentText = WebBrowser1.DocumentText.Replace("alert", "");
      • @robert:这段代码放在表单的构造函数中。而且你不能只用空替换alert。因为alert("hello"); 将是("hello");,这可能会导致js 错误。你必须找到一个合适的方法来替换,这真的取决于。
      • 你的意思是我必须把代码放在 private void InitializeComponent() { HERE ??
      • 我把那个 WebBrowser1.Navigated += (sender, args) => { var document = (sender as WebBrowser1).DocumentText; //找到警报脚本并删除/替换它们 };我收到此错误:.main.WebBrowser1' 是一个“字段”,但用作“类型”我的 webbrowser 控件的名称是 WebBrowser1
      【解决方案6】:

      您可以通过设置禁用所有弹出窗口

      webBrowser.ScriptErrorsSuppressed = true;
      

      尽管名称如此,但此设置实际上会阻止所有弹出窗口,包括alert()

      【讨论】:

        猜你喜欢
        • 2011-07-25
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        相关资源
        最近更新 更多