如何在mshtml.HTMLDocument(.NET)中禁用Javascript

时间:2008-09-25 22:47:00

标签: .net javascript html mshtml

我有一个这样的代码:

Dim Document As New mshtml.HTMLDocument
Dim iDoc As mshtml.IHTMLDocument2 = CType(Document, mshtml.IHTMLDocument2)
iDoc.write(html)
iDoc.close()

然而,当我加载这样的HTML时,它会执行其中的所有Javascripts以及从“html”代码请求某些资源。

我想禁用javascript和所有其他弹出窗口(例如证书错误)。

我的目标是使用mshtml文档中的DOM以可靠的方式从HTML中提取一些标签(而不是一堆正则表达式)。

或者是否有另一个IE / Office DLL我可以加载HTML而不考虑与IE相关的弹出窗口或活动脚本?

4 个答案:

答案 0 :(得分:6)

Dim Document As New mshtml.HTMLDocument
Dim iDoc As mshtml.IHTMLDocument2 = CType(Document, mshtml.IHTMLDocument2)
'add this code
iDoc.designMode="On"
iDoc.write(html)iDoc.close()

答案 1 :(得分:1)

如果您已经将'html'作为字符串,并且您只想访问它的DOM视图,为什么要将它“渲染”到浏览器控件呢?

我不熟悉.Net技术,但必须有某种类型的StringToDOM / StringToJSON类型更适合您的需求。

同样,如果您在上面使用的'html'变量是一个URL,那么只需使用wget或类似的方法将标记检索为字符串,然后使用适用的工具进行解析。

我会寻找一个.Net XML / DOM库并使用它。 (再次,我认为这将是语言的一部分,但我不确定)

PS快速谷歌后我找到了这个(source)。如果你要在HTMLDocument中使用它,不确定它是否会有所帮助。

    if(typeof(DOMParser) == 'undefined') {
      DOMParser = function() {}
      DOMParser.prototype.parseFromString = function(str, contentType) {
      if(typeof(ActiveXObject) != 'undefined') {
        var xmldata = new ActiveXObject('MSXML.DomDocument');
        xmldata.async = false;
        xmldata.loadXML(str);
        return xmldata;
     } else if(typeof(XMLHttpRequest) != 'undefined') {
        var xmldata = new XMLHttpRequest;
        if(!contentType) {
          contentType = 'application/xml';
        }
        xmldata.open('GET', 'data:' + contentType + ';charset=utf-8,' + encodeURIComponent(str), false);
        if(xmldata.overrideMimeType) {
          xmldata.overrideMimeType(contentType);
        }
        xmldata.send(null);
        return xmldata.responseXML;
     }
  }
}

答案 2 :(得分:0)

这听起来像是在屏幕抓取某些资源,然后尝试以编程方式执行与生成的HTML相关的操作?

如果您提前知道它是有效的XHTML,那么将XHTML字符串(实际上是XML)加载到XmlDocument对象中,然后以这种方式使用它。

否则,如果它可能无效,或者格式不正确,那么你需要像hpricot这样的东西(但这是一个Ruby库)

答案 3 :(得分:0)

如果我没记错,MSHTML会自动继承IE的设置。

因此,如果您在Internet Explorer中为正在执行代码的用户禁用javascript,则Javascript也不应在MSHTML中运行。