0

我正在为 Firefox 做一个插件。我想从 HTML 页面中提取视频并将其显示在黑色背景上。这就是我所拥有的。

//main.js
var pageMod = require("page-mod");

pageMod.add(new pageMod.PageMod({
  include: "http://myserver.fr/*",
  contentStyleFile: data.url("modify.css"),
  contentScriptFile: data.url('hack.js'),
  contentScriptWhen: 'start'
}));
//hack.js
video = document.body.innerHTML;
document.body.innerHTML = '';
video = video.substring(video.lastIndexOf("<object"),video.lastIndexOf("</object>"));
video = "<div id='fond'></div><div id='mavideo'>"+video+"</div>"

document.body.innerHTML = video;
document.body.style.backgroundColor = "black";
document.body.style.margin = "0";

我的代码有效,但问题是我必须等待“几个小时”,而其他 javascript 正在执行。我尝试使用 contentScriptWhen: 'start' 但我没有改变任何东西。

任何想法阻止页面的其他脚本?

4

1 回答 1

1

阻止脚本加载会有点困难,我们可以快速删除它们。

// remove all scripts
var scripts = document.getElementsByTagName("script");
var parent = null;
for (var i = 0; i < scripts.length; i += 1) {
    parent = scripts.item(i).parentNode;
    parent.removeChild(scripts.item(i));
}

此代码尝试从您的页面中删除所有脚本标记,这将停止加载任何脚本并允许您运行其余代码。把它放在hack.js脚本的顶部。

我不知道您正在查看的页面,因此除了您使用 之外,很难知道发生了什么substring,而且lastIndexOf速度也不会很快。我们可以摆脱这些,看看你是否有任何明显的速度提升。

尝试改用查询选择器和文档片段。这是一个例子:

//hack.js
var fragment = document.createDocumentFragment();
var objects = document.getElementsByTagName("object");
// create your div objects and append to the fragment
var fond = document.createElement("div");
fond.setAttribute("id", "fond");
fragment.appendChild(fond);
var mavideo = document.createElement("div");
mavideo.setAttribute("id", "mavideo");
fragment.appendChild(mavideo);
// append all <object> tags to your video div
for (var i = 0; i < objects.length; i += 1) {
    mavideo.appendChild(objects.item(i));
}
// clear and append it all in
document.body.innerHTML = '';
document.body.appendChild(fragment);

该代码将所有对象放入文档片段中,因此您可以擦除整个页面,然后将其全部重新添加;不需要库。你的 div 和 mavideo 也在那里。

我并没有真正测试所有这些代码,所以希望它能按预期工作。

于 2012-10-02T00:29:07.473 回答