8

我正在尝试在消息显示在 Thunderbird 的主窗口之前对其进行修改。我似乎找不到 1) 打开/查看新消息时将触发的事件 2) 修改消息显示内容的方法。

我相信我需要chrome://messenger/content/messenger.xul覆盖,并且可以使用如下监听器:

window.addEventListener( "SOME MAGIC HERE", modify_message_handler, true );

但我不确定那个事件是什么,以及我将获得什么对象(消息头?)以及我可以多么容易地修改显示的内容。

所以问题是:

  • 我有正确的覆盖吗?
  • 这可以通过事件来完成吗?如果没有,怎么办?
  • 如果是这样,需要什么事件以及它传递什么对象?
4

4 回答 4

10

如果您想要的是类似于在每条消息上运行的 Greasemonkey 脚本,您应该:

  1. 等待load事件的发生window
  2. 使用 检索消息窗格对象document.getElementById("messagepane")
  3. 将您的处理程序绑定到消息窗格的DOMContentLoaded事件或类似事件,例如load取决于您希望何时调用处理程序。DOMContentLoaded会给你一个 Greasemonkey 风格的行为。
  4. 在事件处理程序中,event.originalTarget是与显示的消息对应的文档。您可以在此处应用所有常用的 DOM 修改技术。

有关更多详细信息,请参阅文档中的此示例

于 2012-07-10T19:19:10.747 回答
5

目前尚不清楚您尝试查看的位置,但我会提供一个建议:这个过时的文档表明有一个 OnItemPropertyChanged 事件,您可以利用该事件来侦听“open”属性,该属性似乎在来源

但是,这是否仅适用于文件夹或同时适用于文件夹和消息尚不清楚。并且您必须更深入地了解传入的项目对象的属性是否允许您进行更改。

希望能有所启发;如果你已经经历过这些,请告诉我们你学到了什么。

于 2012-07-10T18:44:07.570 回答
3

我将主要解决thunderbird-extension您问题中的标签。

Thunderbird Extension 作者Paolo “Kaosmos”有许多现成的工具供您考虑。


标头工具精简版:

编辑功能(仅更改标题或消息的整个源代码)可从菜单“消息”->“HeaderToolsLite”或消息面板中的上下文菜单访问。

应谨慎使用整个源代码的编辑功能,因为错误的更改会导致文件夹中所有消息的显示出现问题。



附加额外工具:

attach easily messages selected in the main window<br />
attach attachments from other messages<br />
attach files from 5 favourite directories<br />
attach files and directories in zipped format<br />



DSN 选项 GUI:

一个扩展,它添加了一个图形界面来处理关于“传递状态通知”(DSN)的全局和每个帐户的首选项。



有用的链接:
Notable Reference 1: 修改消息的常见用例
Notable Reference 2: Thunderbird API for Message Window and Message Header
Notable Reference 3: 构建 Thunderbird 扩展
Notable Reference 4: 在扩展中使用 XUL Thunderbird UI

于 2012-07-10T23:05:32.113 回答
2

Generic Human 通过急需的链接让我走上了正确的道路。首先是添加一个load事件。我将以我非常原始的理解粘贴一些代码:

window.addEventListener("load", function load(event) {
        window.removeEventListener("load", load, false);
        myExtension.init();
}, false);

当此脚本的覆盖加载时,运行init.

var myExtension = {
  init: function() {
        var appcontent = document.getElementById("appcontent"); // browser app content
        if (appcontent) {
                appcontent.addEventListener("OMContentLoaded", myExtension.onPageLoad, true);
        }
        var messagepane = document.getElementById("messagepane"); // tunderbird message pane
        if(messagepane) {
                messagepane.addEventListener("load", function(event) { myExtension.onPageLoad(event); }, true);
        }
  },

在我添加了一个监听器,它在每次显示消息时init调用。onPageLoad我实际上并没有使用appcontent案例 afaik。

  onPageLoad: function(aEvent) {
                var doc = aEvent.originalTarget;  // doc is document that triggered "onload" event
                // we can now morph the loaded page
                // doc.location is a 'Location' object
                var newDat = mutateBody(doc.body.innerHTML);
                doc.body.innerHTML = newDat;
                aEvent.originalTarget.defaultView.addEventListener("unload", function(event) { myExtension.onPageUnload(event); }, true);
  },

  onPageUnload: function(aEvent) {
    // No action necessary yet
  }
};

doc.body.textContents似乎是一个明显的元素,但它实际上并没有保持格式(该死的 HTML) - 使用innerHTML效果更好地满足我的需求。

于 2012-07-16T23:52:30.080 回答