【问题标题】:Accessing the Thunderbird message when closing a message tab / window关闭消息选项卡/窗口时访问 Thunderbird 消息
【发布时间】:2012-04-06 15:24:37
【问题描述】:

我们开发了一个 Thunderbird (11) 插件,允许我们将消息的内容保存到磁盘。现在我们正在扩展此扩展程序,以便在您关闭消息时自动处理它。我们遇到了许多问题:

我们找不到挂钩“关闭标签”事件的方法。我们也无法获取当前打开的选项卡的消息 URI(我们现在正在尝试捕获点击和键盘事件)。此信息在选项卡容器的 DOM 中似乎不可用。

有没有办法以通用方式检测邮件消息选项卡或窗口的关闭,以及检索已关闭邮件消息的 URI 以进行进一步处理?

我们查看了选项卡容器的文档NsIWindowMediator,尝试了各种事件侦听器,但到目前为止都没有运气。

编辑:我们正在使用最近关闭的标签列表获得一些结果。不是一个非常优雅的解决方案,但至少我们有一个对选项卡的引用。现在我们只需要获取选项卡中包含的消息的 URI。

【问题讨论】:

    标签: xul thunderbird


    【解决方案1】:

    我们找不到挂钩“关闭标签”事件的方法。

    (badly documented)<tabmail> 元素允许注册选项卡监视器。像这样的东西应该可以工作:

    var tabmail = document.getElementById("tabmail");
    var monitor = {
      onTabClosing: function(tab)
      {
        ...
      }
    };
    tabmail.registerTabMonitor(monitor);
    

    我们也无法获取当前打开的标签页的消息 URI

    <tabmail> 元素有一个属性tabInfo,其中包含有关当前打开的选项卡的信息。您可能只想查看mode.name"message" 的选项卡(还有许多其他模式,例如"folder""contentTab")。这种模式有一个getBrowser() 方法,所以应该这样做:

    var tabmail = document.getElementById("tabmail");
    for (var i = 0; i < tabmail.tabInfo.length; i++)
    {
      var tab = tabmail.tabInfo[i];
      if (tab.mode.name == "message")
        alert(tab.mode.getBrowser().currentURI.spec);
    }
    

    编辑:正如 Peter 在 cmets 中指出的那样,获取消息 URI 的方法仅适用于当前加载的消息 - 所有选项卡都为邮件消息重用相同的浏览器元素。正确获取 URI 比较复杂,您必须通过 TabInfo.folderDisplay.selectedMessage 获取消息的 nsIMsgDBHdr instance,然后使用 nsIMsgFolder.getUriForMsg() 为其构造 URI:

    var tabmail = document.getElementById("tabmail");
    for (var i = 0; i < tabmail.tabInfo.length; i++)
    {
      var tab = tabmail.tabInfo[i];
      if (tab.mode.name != "message")
        continue;
      var message = tab.folderDisplay.selectedMessage;
      alert(message.folder.getUriForMsg(message));
    }
    

    【讨论】:

    • 谢谢,这看起来很有希望!
    • 第二部分(getBrowser.currentURI.spec)不起作用,因为所有消息/文件夹选项卡都使用相同的浏览器对象。 (getBrowser:(function (aTab) { // 消息选项卡始终使用消息窗格浏览器。return document.getElementById("messagepane"); }))
    • @Peter:你是对的,邮件总是加载到同一个浏览器中,所以这种方法只会给你当前打开邮件的 URI。我已经用获取 URI 的正确方法更新了我的答案。
    【解决方案2】:

    对于问题的第二部分:

    以下示例代码将为您提供所有打开的选项卡的 msgDBHdr 对象。您应该对类型进行一些检查以避免访问日历选项卡中的消息。):

    tabInfos = window.document.getElementById("tabmail").tabInfo;
    for (i = 0; i < tabInfos.length; i++) {      
      msgHdr = tabInfos[i].folderDisplay.selectedMessage;
      alert(
        msgHdr.mime2DecodedSubject+"\n"
       +msgHdr.messageId+"\n"
       +"in view type "+tabInfos[i].mode.type
      );
    }
    

    tabinfo 条目有一些更有趣的信息。只需打开 ErrorConsole 并运行

    top.opener.window.document.getElementById("tabmail").tabInfo[0].toSource()
    

    并仔细阅读。

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 2014-09-28
      • 2012-11-05
      • 2023-02-24
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多