0

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

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

MutationObserver当我试穿并正常报告时,它的工作原理google.com。到目前为止,我的代码只是这个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或者这与frames 和framesets 有什么关系吗?

编辑 - 具有讽刺意味的是,除了路由器接口之外,我能找到的唯一在线测试我的代码的地方是The World's Worst Website。甚至 jsfiddle 和 codepen 都无法忍受framesetand frame

4

1 回答 1

0

我要把这件事搁置一旁。我最初想以这种方式解决我的问题,以避免使用greasemonkey api来存储值(因为如果我在框架的上下文中并且我刷新,存储的变量将被擦除)并使用更优雅和简单的检查方式是否使用特定 url 加载特定框架。结果是,当在 a 中加载新的 url 时,浏览器(Chrome、Firefox、Opera)不会产生事件frame(我不知道iframes由于沙盒,行为是否相同,或者iframes行为与 Ancient 不同frames)。

总而言之,如果您需要做这样的事情(在帧的刷新之间维护用户脚本中的变量),请@match使用指令定位您特别要监视的帧并使用greasemonkey api(或您的用户脚本扩展具有的任何api用于永久存储值)。如果您想在自己制作的网站上执行此操作,请不要使用框架(最好),或者postMesssage在您需要的地方使用或附加事件处理程序。

要点是,框架很糟糕。

于 2014-08-04T05:10:59.723 回答