1

我正在开发一些网络自动化工具(C#,但这个主题与它无关......)。工具取消 WebBrowser 作为浏览器并连接到某些网站。

网站具有动态内容,每秒更新一次。网站使用 setTimeout 来更新其内容。然后数据响应网站更新 DOM 元素(表)内的内容。它删除 3 个旧行并插入 3 个新行。

我的目标是触发这个事件。

我查了一下,网站没有使用document.write。据我了解,网站可以通过一些方式修改内容。首先是innerHTML属性,但表有 4 行,站点不更新/删除第一行。所以另一种方法是appendChildremoveChild它更真实。所以我的问题是如何触发这个动作?

据我所知,可以为 DOM 元素定义我自己的函数。那么我如何重新定义 appendChild 和 removeChild 方法呢?

可能是这样的吗?:

var realRC = contentTable.removeChild;
contentTable.removeChild = function(el){
alert("Trigged!");
realRC(el);
}
4

2 回答 2

4

当您说“触发”时,我假设您的意思是触发。

触发它

在浏览器中超时和间隔都有ID,你可以清除它们但你不能直接触发它。最好的办法是寻找 setTimeout/setInterval 语句并复制它们。

监听事件

无论如何,有一种肮脏的方式和一种干净的方式。假设您可以访问您的表:

var target = document.querySelector('#some-id');

干净的方法是使用 DOM Mutation Observers

// Example from MDN
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type); // here you'll get the changes
  });    
});
// configuration of the observer:
var config = { attributes: true, childList: true, characterData: true };

// pass in the target node, as well as the observer options
observer.observe(target, config);

肮脏的方式是脏检查

它得到更好的支持和更稳定,因为观察者确实是新的并且仍然存在问题。每 16 毫秒检查一次.innerHTML表的值是否更改。

var oldHTML = "";
setTimeout(function(){
    if(target.innerHTML !== oldHTML){
        changed(); // changed is a function that you define and notify
    }
},16);

如果有诸如位置/等之类的 HTML 更改,您可以.textContent改用。

老实说,肮脏的方式更简单,更稳定 - 但更丑陋。我还是会去的。

于 2013-11-06T13:54:50.297 回答
0

Benjamin Gruenbaum 解决它)我在这里发布这个以获得更多可读性!

var dataTable = document.getElementById("event_1538016");

dataTable.appendChild = function(node)
{
    console.log("trigged!");
    document.appendChild.apply(dataTable,[node]); // args is array!!
    return node;
}

在 Mozilla 上完美运行!我希望它适用于 IE9+

于 2013-11-06T14:58:53.337 回答