我想使用C#(winforms)中的webBrowser控件API或使用注入的java脚本在特定网页元素中搜索单词。
我使用了以下java脚本并将其注入加载的网页:
var TRange=null;
function findString (str) {
var strFound;
// EXPLORER-SPECIFIC CODE
if (TRange!=null) {
TRange.collapse(false);
strFound=TRange.findText(str);
if (strFound) TRange.select();
}
else if (TRange==null || strFound==0) {
TRange=self.document.body.createTextRange();
strFound=TRange.findText(str);
if (strFound) TRange.select();
}
if (!strFound) alert ("String '"+str+"' not found!")
return;
}
此代码适用于整个页面,但我想在特定元素的内部文本中进行搜索。如何限制搜索到这样的元素?
答案 0 :(得分:1)
您需要:
Microsoft.mshtml.dll
webBrowser1.Document.Body.DomElement
IHTMLBodyElement
IHTMLElement
。 IHtmlTextRange
createTextRange
moveToElementText
findText
select
。以下是我们在"some"
中找到"div2"
文字的工作示例,而我们有2个div
元素,div1
和div2
,并且这两个元素都包含"some"
文字。
<强>表格强>
创建Form
并在WebBrowser
上放置Form1
控件并编写此代码:
public Form1()
{
InitializeComponent();
this.Load += Form1_Load;
this.webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
}
private void Form1_Load(object sender, EventArgs e)
{
this.webBrowser1.Navigate(@"D:\file.html");
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var searchText="some";
var body = webBrowser1.Document.Body.DomElement as IHTMLBodyElement;
var tag= webBrowser1.Document.GetElementById("div2").DomElement as IHTMLElement;
var range = body.createTextRange();
range.moveToElementText(tag);
if (range.findText(searchText, searchText.Length, 0))
range.select();
else
MessageBox.Show(string.Format("String '{0}' not found.", searchText));
}
示例Html内容
以下是file.html
的测试内容:
<html>
<head><title>Select content</title></head>
<body>
<div id="div1">Here is some content</div>
<div id="div2">Here is some other content</div>
</body>
</html>
<强>截图强>
以下是截图:
注意强>
var tag = this.webBrowser1.Document.Body.All.GetElementsByName("somename")
.Cast<HtmlElement>()
.FirstOrDefault().DomElement as IHTMLElement;
答案 1 :(得分:1)
以下在第一次调用中使用moveToElementText
的java脚本(当TRange
为空时)可以使用
var TRange=null;
function findString (str) {
var strFound;
// EXPLORER-SPECIFIC CODE
if (TRange!=null) {
TRange.collapse(false);
strFound=TRange.findText(str);
if (strFound) TRange.select();
}
else if (TRange==null || strFound==0) {
TRange=self.document.body.createTextRange();
var elem = document.getElementById('my_elem');
// go to the element text
TRange.moveToElementText(elem);
strFound=TRange.findText(str);
if (strFound) TRange.select();
}
if (!strFound) alert ("String '"+str+"' not found!")
return;
}
答案 2 :(得分:0)
我假设您知道如何获取元素的DOM引用。接下来,您可以使用JQuery过滤元素中的文本节点,如:
$($element.contents()).filter(function(){
return this.nodeType === 3; // filter textnodes only
}).each(function(){
findString(this.textContent);
});