DOM文本的触发器已更改

时间:2013-11-06 13:51:39

标签: javascript html dom

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

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

我的目标是触发此事件。

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

我知道可以为DOM元素定义自己的func。那么我如何重新定义appendChild和removeChild方法?

可能是这样的事情?:

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

2 个答案:

答案 0 :(得分:4)

当你说" trig"时,我认为你的意思是触发器。

触发

在浏览器超时和间隔中都有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代替。

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

答案 1 :(得分: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 +