【问题标题】:GMail: Add a link next to each attachment download linkGMail:在每个附件下载链接旁边添加一个链接
【发布时间】:2011-08-24 16:49:59
【问题描述】:

我正在开发一个 chrome 扩展,其目的是为 gmail 中的每个附件添加一个“导出到 gdocs”链接。

我已经实现了成功在“下载”链接旁边添加链接的部分代码,但我遇到了一个我不知道如何解决的问题。

问题是:在一个邮件线程(有多个回复)中,折叠的邮件不受我的脚本的影响 - 当它们展开时,链接(如预期的那样)未添加

发生这种情况的原因是折叠的邮件在展开时会在运行时加载 - 所以当我的脚本在页面加载时执行时,由于邮件内容尚未加载,因此没有要添加的链接。

我尝试使用原型框架和我在此处找到的示例代码添加更新处理程序:

http://groups.google.com/group/prototype-scriptaculous/browse_thread/thread/5ad539212ea07716?pli=1(最后发帖)

http://jsbin.com/utuvu

但它不起作用 - 尽管解决方案本身是有效的并且可以使用 gmail。

部分工作的解决方案是使用 chrome.tabs onUpdate 监听器(在后台文件中注册)和一些 jquery(作为内容脚本注入)实现的:

选择具有“cr hf”css 类的表(用于包含附件链接的表)

$('table.cf.hr').each(function() {
    injectLink($(this));
});

对于每一个,查找下载链接,从下载 url 中提取一些参数, 创建一个新链接并添加到最后一个链接旁边

function injectLink(table) {
    var downloadLink = table.find("td:last a:last");
    var exportToGdocsLink = downloadLink.clone().attr(...)...
    ...
    downloadLink.after(exportToGdocsLink).after("<span>&nbsp;&nbsp;&nbsp;</span>");
}

有人实现了与 gmail 交互的 chrome 扩展吗?有什么提示可以让我弄清楚如何进行吗?

更新

最新版本的代码是这样的:

$('#canvas_frame').ready(function() { 
    var doc = frames['canvas_frame'].contentDocument; 
    $(doc).find('table.cf.hr').livequery(function() { 
        injectLink($(this)); 
    }); 
}); 

但我尝试了几种“组合”——这是“最接近预期”的结果。 canvas_frame 是包含整个 gmail 界面的 iframe。具有 css 类cr hf 的表包含附件链接。

谢谢 安东尼奥

【问题讨论】:

  • jquery的.live()不可以解决吗?
  • 从未使用过...但我想知道它对我有什么帮助 - 据我所知,没有“更新内容”事件。知道我应该使用 live() 注册什么样的事件吗?
  • @Antonio - 你设法解决了这个问题吗?您的项目是否有机会在某个地方开源?
  • @Shaihi:不抱歉,我没有解决。这是给我的一个客户的,所以我不能透露消息来源,即使我没有完成。

标签: javascript google-chrome-extension gmail


【解决方案1】:

.live() 只有在您捕捉事件时才会有所帮助。

您可以使用live query jquery 插件检测元素创建。

纯 javascript 解决方案将监听 DOMSubtreeModifiedDOMNodeInserted events,只要 DOM 更改就会触发(只需要小心,因为一次可能有数百个)。

【讨论】:

  • 我尝试了实时插件,但发生了一些奇怪的事情。我花了几个小时试图弄清楚为什么它不起作用,然后我偶然发现它起作用了,但不是在我期望的时候:只有当我点击我的代码添加的任何其他链接时,我的链接才会被添加。附加到click事件的js只是做一个ajax调用
  • @Antonio 你能把你的新代码放到这个问题中吗?我没有处理过gmail,所以我不知道所有细节。我可能只会在 javascript 方面发现一些东西。
  • 最新版本的代码是这样的: $('#canvas_frame').ready(function() { var doc = frames['canvas_frame'].contentDocument; $(doc).find( 'table.cf.hr').livequery(function() { injectLink($(this)); }); });但我尝试了几种“组合”——这是“最接近预期”的结果。 canvas_frame 是包含整个 gmail 界面的 iframe。具有 css 类“cr hf”的表包含附件链接。
猜你喜欢
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多