0

所以首先我做了一个

jpm init

在专用于它的文件夹中。

然后我想对某个页面进行基本的 DOM 操作。

这就是我所做的:

ff-main.js:

var pageMod = require("sdk/page-mod");

pageMod.PageMod({
    include: /\/*.facebook\.*/,
    contentScriptFile: [
        data.url("jquery-2.2.1.min.js"),
        data.url("script.js")
    ]
});

脚本.js

window.alert('Hey!');

目前它不是真正的 DOM 操作,但它仍然不起作用。它使用 RegEx 表达式仅在 facebook 上加载,所有 http/https/www/m + .com .co.uk .nz .fr .de .it .ru (lol)。

然后我做了基本的

jpm xpi
jpm sign ...

当我在重新启动 Firefox 后加载页面时,它什么也不做。

为什么?

4

1 回答 1

0

您在options 对象的属性中传递了一个RegExp。这样做时,您的正则表达式: includePageMod

必须匹配整个 URL,而不仅仅是一个子集,并且禁用了 global、ignoreCase 和 multiline。

有关更多详细信息,您可以查看MDN 上的讨论。如果您已经访问过此页面,您可能需要点击ctrl- F5,因为我刚刚更新了一些 RegExp 示例。

你的正则表达式是/\/*.facebook\.*/. 这不可能匹配任何有效 URL 的全部内容。它目前将匹配以下内容:

.facebook
Afacebook
//////////////Bfacebook................

但是,匹配:

http://www.facebook.com/

因此,您PageMod将永远不会被应用。

你想要这样的东西:

var pageMod = require("sdk/page-mod");

pageMod.PageMod({
    include: /[^:/]+:\/\/[^/]*\.facebook\.([^/.]*|co\.uk)\/.*/, 
    contentScriptFile: [
        data.url("jquery-2.2.1.min.js"),
        data.url("script.js")
    ]
});

但是,列出要匹配的顶级域 (TLD)会更安全。您必须选择是否要匹配太多域(所有 TLD 或所有包含 的域facebook),或者只匹配您已验证属于 Facebook 的域。您选择哪一个取决于您的附加组件的功能,以及您希望如何平衡用户的易用性与不在接近facebook. 理想情况下,您将确定 facebook 拥有的所有域,这些域显示您想要的内容并包含这些内容。

一个include包含您在问题中列出的域的示例:

    include: /[^:/]+:\/\/[^/]*\.facebook\.(com|co\.uk|nz|fr|de|it|ru)\/.*/,

完整的 SDK 插件:

这是我用于测试的完整 Firefox Add-on SDK 扩展:

包.json

{
    "title": "Test PageMod RegExp",
    "name": "pagemodregexp1",
    "version": "0.0.1",
    "description": "Test using a RegExp with PageMod",
    "main": "index.js",
    "author": "Makyen",
    "engines": {
        "firefox": ">=38.0a1",
        "fennec": ">=38.0a1"
    },
    "license": "MIT",
    "keywords": [
        "jetpack"
    ]
}

index.js

var self = require("sdk/self");
var data = self.data;

var pageMod = require("sdk/page-mod");

pageMod.PageMod({
    //Works (but matches probably bad domain facebook.co.uk):
    //include: /[^:/]+:\/\/[^/]*\.facebook\.([^/.]*|co\.uk)\/.*/,
    //Works (but matches probably bad domain facebook.co.uk):
    //include: /[^:/]+:\/\/[^/]*\.facebook\.(com|co\.uk|nz|fr|de|it|ru)\/.*/,
    //Works:
    include: /[^:/]+:\/\/[^/]*\.facebook\.com\/.*/,


    contentScriptFile: [
//        data.url('jquery-2.2.1.min.js'),
        data.url('contentScript.js')
    ]
});

数据/contentScript.js

window.alert('contentScript.js loaded. URL=' + document.URL);
console.log('contentScript.js loaded. URL=' + document.URL);

导航到时的控制台输出facebook.com(以及每个警报console.log()):

console.log: pagemodregexp1: contentScript.js loaded. URL=https://staticxx.facebook.com/common/referer_frame.php
console.log: pagemodregexp1: contentScript.js loaded. URL=https://staticxx.facebook.com/common/referer_frame.php
console.log: pagemodregexp1: contentScript.js loaded. URL=https://www.facebook.com/

关于您列出的域的注释:

facebook.com:   valid
facebook.co.uk: broken good chance it is not be owned by Facebook
                Whois shows registered to: Technomicom Inc.
                NOT registered to Facebook UK LTD (& uses a different physical address)
facebook.nz:    invalid: Server not found
facebook.fr:    valid: redirects to fr-fr.facebook.com
facebook.de:    valid: redirects to de-de.facebook.com
facebook.it:    valid: redirects to facebook.com
facebook.ru:    invalid: Server not found

鉴于 Facebook 似乎将所有备用域重定向到facebook.com,我建议不要在您的匹配中包含任何其他域,除了facebook.com

include: /[^:/]+:\/\/[^/]*\.facebook\.com\/.*/,
于 2016-08-11T17:15:59.680 回答