MutationObserver报告asp页面中的framset没有变化

MutationObserver reports no changes in framset within asp page

本文关键字:framset 有变化 报告 asp MutationObserver      更新时间:2023-09-26

我正在尝试使用Tampermonkey在Opera上编写一个用户脚本(尽管我已经尝试了ViolentMonkey,但结果相同(,该脚本将在我的路由器的配置页面上运行,并根据显示的统计信息计算一些值。

问题是,这是一个.asp页面,只有一个frameset(没有body元素,尽管我不知道这对asp来说是否正常,但从未使用过它(和3个frame元素。在尝试了一些DOM方法后,我偶然发现了MutationObserver,它很有用,但由于url没有改变,需要一些非常不雅的方法来实际检测页面上的内容,但无论我做什么,我似乎都无法让它返回任何事件。

当我在google.com上试用MutationObserver时,它可以正常工作并报告。到目前为止,我的代码只是对MutationObserver功能的测试,所以它基本上是从这里复制/粘贴的,看起来像这样(略有修改(:

// ==UserScript==
// @name       meh
// @match      http://192.168.1.1/cgi-bin/index.asp
// @run-at     document-end
// ==/UserScript==
// MDN code starts here
var target = document.body;
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });    
});
var config = { attributes: true, childList: true, characterData: true, subtree: true };
observer.observe(target, config);
// end of userscript

这个精确的代码在google.com上运行得非常好。此外,我的@match指令也不是问题,因为我将观察者记录到控制台(此处未显示(,以确保它与正确的url匹配。

我尝试过各种元素作为目标(如果这是问题的话(,如window.frames['framename'].document.body等,我也尝试过在配置中使用和不使用subtree,以及将document-start用于@run-at指令。不管怎样,我都不会在控制台中记录任何突变。

我在网上找不到任何关于这个特定案例的信息,所以我需要问,.asp页面有什么特别的地方会干扰MutationObserver吗?或者这与frame s和frameset s有关?

编辑-具有讽刺意味的是,除了路由器的接口,我在网上唯一能找到的测试代码的地方是世界上最糟糕的网站。即使是jsfiddle和codepen也无法忍受framesetframe

我要解决这个问题。我最初想用这种方式来解决我的问题,以避免使用防油麦api来存储值(因为如果我在一个帧的上下文中刷新,存储的变量会被擦除(,并使用一种更优雅、更简单的方式来检查特定帧是否加载了特定的url。事实证明,当在frame中加载新的url时,浏览器(Chrome、Firefox、Opera(不会产生事件(我不知道iframes的行为是否相同,是因为沙盒,还是iframes的行为与古代的frames不同(。

总之,如果您需要做这样的事情(在刷新帧之间在用户脚本中维护一个变量(,请使用@match指令瞄准您特别想要监视的帧,并使用油麦键api(或您的用户脚本扩展具有的用于永久存储值的任何api(。如果你想在自己制作的网站上做到这一点,不要使用框架(最好(,也不要使用postMesssage或在需要的地方附加事件处理程序。

要点是,框架很糟糕。