{jpm} Как заменить любую страницу на свою?

Как я могу заменить любую страницу, например http://google.com/ на мою страницу (я не хочу перенаправлять), включая <head>?

Я попробовал это:

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

// Create a page-mod
// It will run a script whenever a ".io" URL is loaded
// The script replaces the page contents with a message
pageMod.PageMod({
  include: "*.io",
  contentScript: 'document.body.innerHTML = ' +
                 ' "<h1>Page matches ruleset</h1>";'
});

Но это не заменит всю страницу. Я хочу заменить head тоже. Я хочу заменить страницу до загрузки страницы...

1 ответ

Решение

С помощью document.head.innerHTML Вы можете сослаться на заголовок html-страницы, что позволяет установить в ней содержимое.

Также стоит отметить, что API-интерфейс page-mod может принимать несколько аргументов в виде массива строковых литералов, а также может импортировать сценарии из каталога данных.

И, наконец, вы можете настроить запуск скрипта до загрузки страницы, установив опцию page-mod contentScriptWhen до значения start или же ready,

согласно документации:

"start": загрузка сценариев содержимого сразу после вставки элемента документа в DOM, но до загрузки самого содержимого DOM

"ready": загрузка сценариев содержимого после загрузки содержимого DOM, соответствующего событию DOMContentLoaded

"end": загрузка сценариев содержимого после загрузки всего содержимого (DOM, JS, CSS, изображений) в момент возникновения события window.onload

Таким образом, ваш пример изменения заголовка и тела перед загрузкой страницы будет похож на приведенный ниже:

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

// Create a page-mod
// It will run a script whenever a ".org" URL is loaded
// The script replaces the page contents with a message
pageMod.PageMod({
  include: "*.io",
  contentScript: ['document.body.innerHTML = ' +
                 ' "<h1>foo</h1>"',
                 'document.head.innerHTML = ' + 
                 ' "<style>h1 {color:blue;}</style>";'],
  contentScriptWhen: "start"
});

Также стоит отметить, что этот скрипт может работать лучше для некоторых страниц, когда contentScriptWhen установлен в readyиначе изменения могут не распространяться на все элементы на странице.

Другие вопросы по тегам