none
在webBrowser控件中,可以取得通过JS动态给HTML中IMG标签的SRC赋的值吗? RRS feed

  • 问题

  • 在webBrowser控件中,可以取得通过JS动态给HTML中IMG标签的SRC赋的值吗? 可以的,应给怎么取得数据那?
    2011年2月27日 16:14

答案

  • 在webBrowser1_DocumentCompleted 事件里通过 上面我说的两种方法都取不到 SRC 的内容。取SRC的时机感觉没有问题吧。


    1)我写了一个小程序,尝试了一下,是可以看到src内容的,我所使用的方法,和版主给出的是一样的。我认为这个方法应该是没有问题的。为了查出问题所在,能否给出你源码中GetDomById()的实现?(另:control range应该是不会复制图片的,因为control range是在编辑模式中有效——除非你已经强制使文档进入了编辑模式)

    2)src的内容是不会出现在源码中的。element.OuterHtml包含了此element在运行时的信息,比如被脚本修改后的src属性。所以,查看源码是没有用的。正确的方法应该是:在IE中打开http://req.qq.com,按F12打开developer toolbar(IE8及以上版本中),点击Script tab,在console中输入"document.getElementById("vfcode").src",便可看到图片src的运行时的值。如果输入“document.getElementById("vfcode").outerHTML",便可以看到img element的HTML,你也就可以比较其与源码中的HTML,应该是不同的。

    2011年3月4日 9:37

全部回复

  • 答案应该是:可以

    首先,你要得到需要的IMG element。然后,调用其get_src()方法,取得其src值。关于get_src()方法,可参考MSDN:http://msdn.microsoft.com/en-us/library/aa752258(v=vs.85).aspx

     

     

    2011年2月28日 3:31
  • webBrowser.Document.GetElementById("ImgID").SetAttribute("src","http://xxx.jpg") or webBrowser.Document.GetElementsByTagName("IMG")然后for循序找
    【孟子E章】
    2011年2月28日 9:32
    版主
  • 我是在NET环境下开发的,能不能说的详细一点呢。

    我怎么找不到你说的get_src()方法呢?

    HTML:代码

          <div class="formRow">

            <div class="formLabel">验证图片:</div>

            <div class="formField">

        <img id='vfcode' style='cursor:pointer; border:1px solid #e4eef9; float:left;' alt="操作频繁,稍后再试"  title="看不清楚?&nbsp;换张图片" >

              <a id='vfcode_a' href="#" class="chgPic">看不清楚?&nbsp;换张图片</a></div>

          </div>

    通过JS设置SRC:

    function f_RefreshValidcode_Only()
    {
        $("vfcode").src="http://www.jack-net.com/getimage?aid=618&amp;"+Math.random();
    }

    C#代码:
      方法1:

                try
                {
                    HTMLDocument domDocument = (HTMLDocument)this.webBrowser1.Document.DomDocument;
                   
                    //IHTMLControlElement domElement = (IHTMLControlElement)this.webBrowser1.Document.Images[1].DomElement;
                    IHTMLControlElement domElement = (IHTMLControlElement)this.webBrowser1.Document.All["vfcode"].DomElement;
                    IHTMLControlRange range = (IHTMLControlRange)((HTMLBody)domDocument.body).createControlRange();
                    range.add(domElement);
                    range.execCommand("Copy", false, null);
                    domElement = null;
                    range = null;
                    domDocument = null;
    // 剪贴板得不到IMG
                    if (Clipboard.ContainsImage())
                    {
                        this.pictureBox1.Image = null;
                        this.pictureBox1.Image = Clipboard.GetImage();
                    }
                
                    Clipboard.Clear();
                }
                catch (Exception oEx)
                {
                    txtMsg.Text = oEx.Message;
                }

     方法2:

                HtmlElement htmlElement = GetDomById(id);
                string strSrc = htmlElement.GetAttribute("src");

    方法一和二都得不到。

    2011年3月2日 14:07
  • webBrowser.Document.GetElementById("ImgID").SetAttribute("src",http://xxx.jpg)

    -> 和我问的不是一个问题啊,我是想得到SRC的属性。

    webBrowser.Document.GetElementsByTagName("IMG")--> 这种方法试过来,我是直接用的htmlElement.GetAttribute("src");根本得不到,不知道版主有没有试过?

    2011年3月2日 14:10
  • 我认为htmlElement.GetAttribute("src")是正确的方法,我写了一个简单的.net程序,尝试过了。至少当我看到图片更新后,GetAttribute("src")返回了正确的值。如果你还不能成功的话,请试一下在应该调用GetAttribute("src")的地方,调用一下htmlElement.OuterHtml,看一下输出是什么。
    2011年3月2日 18:17
  • webBrowser.Document.GetElementById("vfcode").GetAttribute("src").ToString()应该是可以的,如果得不到,可能是执行的时机不对
    【孟子E章】
    2011年3月3日 0:55
    版主
  • 我用 webBrowser 加载 http://reg.qq.com/ 这个网站,这个网站上有个验证码,我想在 pictureBox 同时显示验证码的内容。

    网站上验证码vfcode是通过,JS动态赋值的,我用IE打开这个网站,然后查看源码,好像也没有看到SRC的内容。

    2011年3月3日 14:29
  • 在webBrowser1_DocumentCompleted 事件里通过 上面我说的两种方法都取不到 SRC 的内容。取SRC的时机感觉没有问题吧。

    2011年3月3日 14:30
  • 在webBrowser1_DocumentCompleted 事件里通过 上面我说的两种方法都取不到 SRC 的内容。取SRC的时机感觉没有问题吧。


    1)我写了一个小程序,尝试了一下,是可以看到src内容的,我所使用的方法,和版主给出的是一样的。我认为这个方法应该是没有问题的。为了查出问题所在,能否给出你源码中GetDomById()的实现?(另:control range应该是不会复制图片的,因为control range是在编辑模式中有效——除非你已经强制使文档进入了编辑模式)

    2)src的内容是不会出现在源码中的。element.OuterHtml包含了此element在运行时的信息,比如被脚本修改后的src属性。所以,查看源码是没有用的。正确的方法应该是:在IE中打开http://req.qq.com,按F12打开developer toolbar(IE8及以上版本中),点击Script tab,在console中输入"document.getElementById("vfcode").src",便可看到图片src的运行时的值。如果输入“document.getElementById("vfcode").outerHTML",便可以看到img element的HTML,你也就可以比较其与源码中的HTML,应该是不同的。

    2011年3月4日 9:37
  • 1). GetDomById()的实现如下:

            private HtmlElement GetDomById(string Id)
            {
                HtmlElement htmlElement = webBrowser1.Document.GetElementById(Id);
               
                if (htmlElement != null)
                {
                    return htmlElement;
                }
                else
                {
                    return null;
                }
            }

    你说可以看到SRC的内容是指:http://captcha.qq.com/getimage?aid=1007901&0.014937521545590415 这样的内容吗?为什么我取不到那?如果能取到SRC内容,能否把你的下程序,发给我那(EMAIL:jaspine#qq.com

    2).IE8中,按你说的确实可以得到。我就是想通过程序,得到document.getElementById("vfcode").src的内容,同时显示在PICBOX控件上,document.getElementById("vfcode").src的内容固定了,验证码也就确定了。

    JS赋值:$("vfcode").src="http://captcha.qq.com/getimage?aid=1007901&"+Math.random();

     

    2011年3月4日 16:24
  • 可以取到了,好像还是时机不对。在webbrower现实验证码后,通过点击BUTTON就可以取到了。(不过两个地方显示的验证码不同)

    现在的问题是怎么判断webbrower上的图片加载完成那

     

    2011年3月4日 17:19
  • 谢谢了,现在可以取到了,加了一个延时,但这样感觉不是太好。

     

    怎么判断webbrower上的图片加载完成那?

    2011年3月4日 17:21
  • 可以监听onreadystatechange事件:http://msdn.microsoft.com/en-us/library/ms536957(v=vs.85).aspx

    或者延时检查readyState属性:((IHTMLImgElement)imgElement).readyState。具体内容可见:http://msdn.microsoft.com/en-us/library/aa752247(v=vs.85).aspx

    2011年3月5日 6:49