【问题标题】:How to inject javascript into an iframe with webbrowser control?如何将 javascript 注入带有 webbrowser 控件的 iframe?
【发布时间】:2015-12-19 14:32:00
【问题描述】:

我正在尝试阻止某些向用户显示警报的 javascript 函数。

我目前正在使用此代码,但它不起作用:

    private void InjectAlertBlocker()
    {            
        string alertBlocker = @"window.alert = function () { }; 
                        window.print = function () { }; 
                        window.open = function () { }; 
                        window.onunload = function () { }; 
                        window.prompt = function () { };
                        window.confirm = function() { };
                        window.onbeforeunload = function () { };";

        wb.Document.InvokeScript("execScript", new Object[] { alertBlocker, "JavaScript" });
    }

网络浏览器控件在后台运行,一些需要访问的网站会显示随机弹出给用户的警报。

我尝试过类似的代码,但无法让它们中的任何一个工作。

更新:

经过一番检查,这段代码似乎确实阻止了警报。但是,在我的特殊情况下,警报来自 iframe,这就是我的代码没有阻止它的原因。 w3schools 上的 javascript 警报示例就是一个很好的例子:http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_alert

如何覆盖 iframe 中的脚本?

更新 2:

我尝试将 javascript 代码(由 Buzinas 在他的回答中提供)注入到主页中,这将遍历所有 iframe 并覆盖它们的警报功能,但由于相同的来源,它大部分时间都会导致错误政策。

【问题讨论】:

    标签: javascript c# iframe webbrowser-control .net-2.0


    【解决方案1】:

    您可以将其附加为<script> 元素,而不是调用脚本:

    HtmlElement head = wb.Document.GetElementsByTagName("head")[0];
    HtmlElement scriptEl = wb.Document.CreateElement("script");
    IHTMLScriptElement el = (IHTMLScriptElement)scriptEl.DomElement;
    el.text =  @"window.alert = function () { }; 
                 window.print = function () { }; 
                 window.open = function () { }; 
                 window.onunload = function () { }; 
                 window.onbeforeunload = function () { };";
    head.AppendChild(scriptEl);
    

    更新

    要确保阻止所有 iframe,您可以执行以下操作:

    HtmlElement head = wb.Document.GetElementsByTagName("head")[0];
    HtmlElement scriptEl = wb.Document.CreateElement("script");
    IHTMLScriptElement el = (IHTMLScriptElement)scriptEl.DomElement;
    el.text =  @"window.alert = function () { }; 
                 window.print = function () { }; 
                 window.open = function () { }; 
                 window.onunload = function () { }; 
                 window.onbeforeunload = function () { };
    
                 var iframes = document.getElementsByTagName('iframe');
                 for (var i = 0; i < iframes.length; i++) {
                   var win = iframes[i].contentWindow;
                   win.alert = function () { }; 
                   win.print = function () { }; 
                   win.open = function () { }; 
                   win.onunload = function () { }; 
                   win.onbeforeunload = function () { };
                 }";
    head.AppendChild(scriptEl);
    

    【讨论】:

    • 这是我尝试过的类似代码之一。它不工作。
    • 看起来导致警报的页面位于 iframe 内,这就是它没有被阻止的原因。我已经更新了原帖。
    • 在 var win = iframes[i].contentWindow; 之后的所有行中出现脚本错误“对象不支持此操作”
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2011-07-26
    相关资源
    最近更新 更多