GreaseMonkey 是一个非常受欢迎的 Firefox 扩展,它允许用户通过自定义脚本来增强网页的功能性。特别地,CodeProject 论坛的“快速回复”功能就是一个很好的例子。原始的脚本可以在此处找到。然而,这个脚本在 Internet Explorer 中并不适用。出于好奇,寻找了是否有适用于 Internet Explorer 的 GreaseMonkey 替代品。发现了几个,但 Trixie 似乎是找到的最可靠的一个。必须下载并安装它(或类似的插件)才能在本文中使用这个脚本。
更新 - 2005年6月14日:这个链接显示 Trixie 已经不再开发,转而支持 Turnabout,它对本文的脚本工作得很好。
本文附带的脚本没有重大更改,除了那些必要的修改,以使 Shog 的 GreaseMonkey 脚本在 Internet Explorer 中使用 Trixie 工作。下载脚本,并按照 Trixie 提供的说明复制安装它。享受它,并告诉如果创建了任何改进或发现错误。
如果想探索代码,可以比较 JavaScript 文件。会发现插入了代码来替换 GreaseMonkey 的 GM_GetValue 和 GM_SetValue 函数。另外,由于 IE 不支持 document.evaluate,不得不用一系列循环和 "if" 语句替换它们,通过 getElementsByTagName 和 getAttribute 的结果进行操作。(确实找到了可以实现 document.evaluate 的 JavaScript 代码,但它并没有处理所有事情,而且加载 CP Lounge 页面非常慢。)
还会注意到一个“hack”,旨在防止快速回复链接和其他功能的多次插入。基本上,在文档的顶部添加了一个标签。如果标签不在那里,就执行插件需要做的所有事情。如果标签已经在那里,它就避免了重复做同样的工作。非常重要,如果想让事情正常工作。(注意,没有发现这是否是 Trixie 特有的问题。)
更新 - 2005年6月10日 - 在文章和 CodeProject 的其他部分使用 CPHog 时,修正了多次插入问题。 更新 - 2005年6月14日 - 添加了 Turnabout 的链接,并描述了 Shog 的脚本在 Internet Explorer 中工作所需的更改。 更新 - 2005年6月17日 - 进行了更改,希望防止 PJ Arends 发现的错误引用问题。
以下是一些示例代码,展示了如何在 Internet Explorer 中使用 Trixie 插件实现 GreaseMonkey 脚本的功能。
// 替换 GreaseMonkey 的 GM_GetValue 和 GM_SetValue 函数
function GM_GetValue(name, defaultValue) {
var value = localStorage.getItem(name);
return value === null ? defaultValue : value;
}
function GM_SetValue(name, value) {
localStorage.setItem(name, value);
}
// 替换 document.evaluate
function evaluateXPath(xpath, contextNode) {
var result = [];
var nodes = contextNode.getElementsByTagName('*');
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
if (node.getAttribute('data-xpath') === xpath) {
result.push(node);
}
}
return result;
}