【问题标题】:Modify websites with Firefox Add-on使用 Firefox 插件修改网站
【发布时间】:2013-12-05 09:55:05
【问题描述】:

我正在编写一个 Firefox 插件,它会在我打开某些特定网站时对其进行修改。但我根本不喜欢 API。 例如,如果我想向选项卡添加一个包含按钮的 div 容器。它看起来像这样:

var myScript = 'document.body.innerHTML += "<div style=background-color:rgba(0,0,0,0.5);position:fixed;width:300px;height:300px;right:0px;top:0px;><input type=button value=test></input></div>";';
tab.attach({ contentScript: myScript });

这是:
1. 完全不可读。
2. 在许多网站上看起来会有所不同,因为有些网站会为所有输入元素添加默认样式。

那么有没有一种更易读的方法来修改不需要将脚本添加为字符串的网站?
有没有办法覆盖网站上的任何元素(甚至是 Flash)?

【问题讨论】:

  • 要完成覆盖页面,您必须在任何脚本加载之前更改 document.html。
  • 我想创建一个覆盖所有其他元素的 div 容器,以便它始终位于顶部。我不想覆盖源代码。

标签: javascript html firefox-addon overlay firefox-addon-sdk


【解决方案1】:

你应该使用contentScriptFile

然后您应该使用不会影响性能的 DOM API 并“在脚上开枪”(不是 .innerHTML),例如:

var div = document.createElement("div");
div.style.backgroundColor = "rgba(0,0,0,0.5)";
...
var input = document.createElement("input");
input.setAttribute("type", "button");
...
div.appendChild(input);
document.body.appendChild(div);

MDN 有文档。

至于样式:这个更难。通常人们不会将 DOM 节点注入页面本身(不仅仅是因为 CSS 兼容性,而是为了避免 Javascript 和/或 DOM 中的冲突),而是创建一个&lt;iframe&gt;,然后它拥有自己的一组 CSS 规则并拥有Javascript环境,甚至受同源政策的约束,如果处理得当,将阻碍网站对内容的混乱。

【讨论】:

  • 听起来不错,谢谢!但我真的不明白如何使用 iframe 来显示我的 div 容器。我的意思是我没有可以放入 iframe 的链接,因为我正在生成代码。
  • contentScriptFile 存在错误问题:我添加到网站的代码是动态生成的。
  • 不要动态生成内容脚本!拥有一个静态内容脚本,并通过some form of message passing 传递动态生成的数据,用于进行适当的更改
  • 嗯,为什么?该脚本只需要生成一次。创建一种与创建的脚本进行通信的方式听起来有点低效和矫枉过正,因为我只需要与它通信一次。
  • 首先:您自己正确地抱怨这完全不可读。然后,将字符串连接在一起并在结果上调用 eval() 的等价物会带来麻烦和/或安全问题......这样的事情也不是很容易维护......如果你真的需要,XHR (request 模块)用户脚本的 URI 和字符串替换了您需要动态创建的内容。但是,如果某些 addons.mozilla.org 编辑器拒绝您的插件以将用户脚本动态连接在一起,请不要在以后抱怨;您已被警告;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 2015-07-02
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多