如何使用所需的innerhtml访问span?

时间:2011-11-03 19:11:37

标签: c# javascript .net html

假设我的WebBrowser1下载了一个包含以下行的页面:

<span customattr="hamolulu">hamolulu</span>

它位于td标签内部,大表内部,iFrame内部,div内部等。

如何使用c#点击此内容?

我需要做以下事情:

int i = 0;
for (i = 0; i <= 500; i++)
{
    if (webBrowser1.Document.GetElementsByTagName("span")[i].GetAttribute("customattr") == "hamolulu")
    {
        webBrowser1.Document.GetElementsByTagName("span")[i].InvokeMember("click");
        break;
    }//end if
}// end for

但由于某种原因,它不能以这种方式工作,所以我在想是否可以检查span的innerHTML或innerText?

我试过了两个:

webBrowser1.Document.GetElementsByTagName("span").InnerHTML == "hamolulu"
webBrowser1.Document.GetElementsByTagName("span").InnerText == "hamolulu"

我两次失败了。

更新:
我刚注意到这条线实际上是这样的:

<span customattr="hamolulu"><a>hamolulu</a></span>

所以我写了一个简单的函数:

int i = 0;
for (i = 0; i <= webBrowser1.Document.GetElementsByTagName("a").Count - 1; i++)
{
  log(i.ToString()+ " : " +webBrowser1.Document.GetElementsByTagName("a")[i].InnerHtml);
} //log(string) is a custom function that saves all strings to a file log.txt

我所看到的是这个链接(和span)没有出现在我的日志中。 换句话说,getElementsByTagName(“span”)和getElementsByTagName(“a”)看不到该项。我的猜测是因为iFrame。你有什么想法吗?

4 个答案:

答案 0 :(得分:1)

另一种不使用js的解决方案(因为你没有“页面”) 因为它在iframe中,所以你应该在iframe中搜索

HtmlElementCollection iframes = WebBrowser1.Document.GetElementsByTagName("iframe");
HtmlElement iframe = iframes(0 /* iframe index */); // 

HtmlElementCollection spans = iframe.Document.GetElementsByTagName("span");
for (i = 0; i < spans.Count; i++) {
    HtmlElement span = spans(i);
    if (span.GetAttribute("customAttr") == "customAttrValue") {
        string onclick = span.Children(0).GetAttribute("onclick"); //span.Children(0) should return the <a>
        WebBrowser1.Document.InvokeScript(onclick);
    }
}

答案 1 :(得分:0)

除非我遗漏了某些东西......

<span id="hamolulu">hamolulu</span>

然后当你想改变它时......

document.getElementById('hamolulu').innerHTML="<h1>Test!</h1>";

答案 2 :(得分:0)

您可以通过使用JavaScript并在需要时从c#调用它来简化它。

WebBrowser1 .Document .InvokeScript ("functionName")

的javascript:

function functionName(){

  var spans = document.getElementsByTagName('SPAN');
  for (i = 0; i < spans.length; i++)
  {
    var span = spans[i];
    if (span.getAttribute("customattr") == "hamolulu")
    {
        eval(span.getAttribute('onclick')); // .. be careful "span" has no "click()" method. you should use the onlick attribute if available
        break;
    }//end if
  }// end for
}

答案 3 :(得分:0)

如果您将span设置为HTML服务器控件:

<span runat="server" id="myspan" customattribute="customvalue">hello world</span>

然后您可以在页面加载时注册事件处理程序:

 protected void Page_Load(object sender, EventArgs e)
    {
        myspan.Attributes["onclick"] = "this.innerText='hamolulu'";
    }

另一种方法是使用Page Methods,它使用AJAX调用页面C#方法。