因此,我尝试使用DispatchTimer()比较两个HTMLDocument,以查看网站中是否有任何更改。
这是我的代码:
HTMLDocument lastDoc;
public void startTimer()
{
lastDoc = (HTMLDocument)Form.RosterBrowser.Document;
DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
dispatcherTimer.Start();
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
var thisDoc = (HTMLDocument)Form.RosterBrowser.Document;
LogTextBlockControl.Text += "DOCUMENT THIS: " + thisDoc.getElementById("groupList").innerText.Length.ToString();
LogTextBlockControl.Text += "DOCUMENT LAST: " + lastDoc.getElementById("groupList").innerText.Length.ToString();
}
如您所见:当时间第一次开始时,我得到HTMLDocument并将其存储在lastDoc中。然后,每2秒,我得到另一个HTMLDocument变量,并将其存储在thisDoc中。现在,我每2秒打印一次特定元素的长度,以查看该元素内部是否有任何更改。
当程序第一次启动时,由于它们都具有相同的HTMLDocument,因此它们都将打印相同的数字,这是正常的。但是可以说我在groupList元素中做了一些更改。您可能会认为thisDoc变量的长度会改变。可以,但是lastDoc的长度也可以。这就是问题所在。
每当元素更改时,thisDoc都会更新并打印更改后的元素的长度,但lastDoc也将更新并开始打印相同的长度。这不是我想要的,因为现在我无法比较两者来触发功能。我在整个程序中只调用一次startTimer(),并且我从不更改lastDoc,它似乎在改变自己。我已经在这个问题上待了一天,希望有人能帮助我。
答案 0 :(得分:0)
Form.RosterBrowser.Document
返回浏览器Document
的引用,因此lastDoc
和thisDoc
是指向相同{{1}的两个引用}位于内存堆中某处的对象。
相反,您应该存储要监视的值。
您最好监视文本本身,不仅要监视文本的长度(因为可以更改文本),还要保持相同的长度。
HTMLDocument
我使用属性string lastText;
private string GroupListText => ((HTMLDocument)Form.RosterBrowser.Document).getElementById("groupList").innerText;
public void startTimer()
{
lastText = GroupListText;
DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
dispatcherTimer.Start();
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
var thisText = GroupListText;
LogTextBlockControl.Text += "DOCUMENT THIS: " + thisText.Length.ToString();
LogTextBlockControl.Text += "DOCUMENT LAST: " + lastText.Length.ToString();
}
来避免重复文本查找表达式。