如何使用webbrowser控件将javascript注入iframe?

时间:2015-09-22 14:37:52

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

我正在尝试阻止向用户显示警报的某些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" });
    }

webbrowser控件在后台运行,一些需要访问的站点正在显示随机弹出给用户的警报。

我尝试过类似的代码,但无法使用它们。

更新:

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

如何覆盖iframe中的脚本?

更新2:

我试图将javascript代码(由Buzinas在他的答案中提供)注入主页面,该主页面将遍历所有iframe并覆盖其警报功能,但由于相同的来源,它在大多数情况下导致错误政策。

1 个答案:

答案 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);