【问题标题】:Pass message from content script to main将消息从内容脚本传递到主脚本
【发布时间】:2014-09-27 03:43:17
【问题描述】:

编辑 3:找到解决方案/修复

这是为我解决它的 SO 线程:PageMod attaching worker to same URL multiple times

TLDR:如果页面包含 iFrame,它将附加一个工作程序/内容脚本,这会导致多个内容脚本尝试运行。使用attachTo: 'top' 只会将脚本附加到顶级文档,而没有 iFrame。


我正在移植我制作的一个简单的 Chrome 扩展程序,但我很难为 Firefox 插件传递消息。这就是我所拥有的。

csScript.js

self.port.emit("url", getVideoUrl());

function getVideoUrl() {  
  return $('meta[itemprop=contentURL]').prop('content');
}

main.js

pageMod.PageMod({
  include: [URLs],
  exclude: [URLs],
  contentScriptFile: [data.url("jquery-2.1.1.min.js"),
                      data.url("csScript.js")],
  onAttach: function(worker) {
    worker.port.on("url", function(url) {
      var videoUrl = validateUrl(url);
      });
    }
  });

当某个 URL 被点击时,我想获取一个属性值并将其发送回我的 main.js 并使用它。现在可以正常工作,我收到message is null 错误。我已阅读文档,但似乎无法理解如何传递消息。


编辑:将onAttach 更改为:

onAttach: function(worker) {
    worker.port.on("url", function(url) {
      var videoUrl = validateUrl(url);
      });
    }
  });

似乎没有太大变化。我需要做的就是将内容脚本中的一个字符串传回我的main.js 文件。但是,通过上面的代码,它告诉我urlnull。我浏览过的所有文档似乎都表明这就是消息传递在 Firefox 插件中的工作方式。


Edit2:添加一些日志语句后,我注意到了几件事:

1) 当一个 URL 匹配时,我的内容脚本正在运行 10 次以上。我不知道为什么。 脚本被附加到每个 iFrame。

2) 大多数情况下,URL 返回 null/undefined。但是,它可以正常工作一次——从内容脚本中提取 URL,然后正确地传递回 main.js 文件。但是,再次运行的内容脚本会立即将其清除。

【问题讨论】:

    标签: firefox firefox-addon firefox-addon-sdk


    【解决方案1】:

    首先确保getVideoUrl() 正在返回一个字符串,我猜

    $('meta[itemprop=contentURL]').prop('content')
    

    在您收到message is null 的情况下不返回字符串。

    你也有:

    onAttach: function(worker) {
      worker.port.on("url", function(message) {
        var videoUrl = validateUrl(message.url);
        videoUrl5k = make5kUrl(videoUrl);
      });
    }
    

    我改成了:

    onAttach: function(worker) {
      worker.port.on("url", function(url) {
        var videoUrl = validateUrl(url);
        videoUrl5k = make5kUrl(videoUrl);
      });
    }
    

    也许这可以解决问题?因为我没有看到make5kUrl的定义

    【讨论】:

    • 嗨 - 感谢您的回答。我做了一个typeof $('meta[itemprop=contentURL]').prop('content'),它确实是一个字符串。我还在内容脚本中放置了console.log 语句,我可以看到当加载匹配的 URL 时,getVideoUrl() 方法被调用了很多次(不知道为什么......)但它正在进入那里。我是否正确发送/接收消息?
    • 请查看我的更新回复,因为我不知道make5kUrl 是如何定义的,我想我错过了太多。
    • 嗯,感谢您的更新回复。那些validateUrlmake5kUrl 方法只是一个小的字符串操作。问题是我似乎无法从内容脚本中得到任何东西。此外,我注意到内容脚本在点击有效 URL 时运行了 10 次以上。是否有什么原因导致它运行不止一次?
    • 找到解决方案。已在顶部编辑 - 再次感谢您的帮助。
    【解决方案2】:

    pageMod 构造函数中,使用attachTo: 'top' 选项会将脚本仅附加到顶级文档。内容脚本被附加到其他 iFrame,然后尝试运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多