Вопрос

У меня есть скрипт Greasemonkey, который отлично работает в Firefox и Opera.Однако мне сложно заставить его работать в Chrome.Проблема заключается во внедрении на страницу функции, которая может быть вызвана кодом со страницы.Вот что я делаю до сих пор:

Сначала я получаю вспомогательную ссылку на небезопасное окно для Фаерфокс.Это позволяет мне иметь один и тот же код для FF и Opera (и Chrome, как я думал).

var uw = (this.unsafeWindow) ? this.unsafeWindow : window;

Затем я добавляю функцию на страницу.На самом деле это просто очень тонкая оболочка, которая ничего не делает, кроме вызова соответствующей функции в контексте моего GM-скрипта:

uw.setConfigOption = function(newValue) {
    setTimeout(setConfigOption, 0, newValue);
}

Затем прямо в моем скрипте есть соответствующая функция:

setConfigOption = function(newValue) {
    // do something with it, e.g. store in localStorage
}

Наконец, я добавляю на страницу HTML-код со ссылкой для вызова функции.

var p = document.createElement('p');
p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';
document.getElementById('injection-point').appendChild(p);

Обобщить:В Firefox, когда пользователь нажимает эту введенную ссылку, он выполняет вызов функции в unsafeWindow, который затем запускает тайм-аут, вызывающий соответствующую функцию в контексте моего сценария GM, который затем выполняет фактическую обработку.(Поправьте меня, если я здесь ошибаюсь.)

В Chrome я просто получаю сообщение «Uncaught ReferenceError:setConfigOption не определен».И действительно, ввод «window.setConfigOption» в консоль дает «неопределенное».В Firebug и консоли разработчика Opera эта функция есть.

Возможно, есть другой способ сделать это, но некоторые из моих функций вызываются Flash-объектом на странице, поэтому, я считаю, необходимо, чтобы у меня были функции в контексте страницы.

Я бросил быстрый взгляд на альтернативы unsafeWindow на вики Greasemonkey, но все они выглядят довольно уродливо.Я совершенно на неправильном пути или мне следует присмотреться к этому более внимательно?

РАЗРЕШЕНИЕ: Я последовал за Макс С. ' совет и теперь он работает как в Firefox, так и в Chrome.Поскольку функции, которые мне нужно было сделать доступными на странице, должны были вызываться обратно в обычные, я переместил на страницу весь свой скрипт, т.е.он полностью заключен в функцию, которую он назвал «main()».

Чтобы сделать дополнительную уродливость этого взлома немного более терпимой, я мог бы хотя бы отказаться от использования unsafeWindow и обернутого JSObject.

Мне до сих пор не удалось получить бегун области контента из вики Greasemonkey работает.Он должен делать то же самое и, кажется, работает нормально, но мои функции никогда не доступны для <a> элементы со страницы, например.Я пока не понял, почему так.

Это было полезно?

Решение

Единственный способ взаимодействовать с кодом, выполняющимся на странице в Chrome, — через DOM, поэтому вам придется использовать хак, например, вставить <script> тег с вашим кодом.Обратите внимание, что это может оказаться ошибочным, если ваш скрипт должен запускаться раньше всего остального на странице.

РЕДАКТИРОВАТЬ: Вот как расширение Nice Alert Означает ли это:

function main () {
  // ...
  window.alert = function() {/* ... */};
  // ...
}

var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);

Другие советы

У меня есть это :

контентscript.js:

function injectJs(link) {
var scr = document.createElement('script');
scr.type="text/javascript";
scr.src=link;
document.getElementsByTagName('head')[0].appendChild(scr)
//document.body.appendChild(scr);
}

injectJs(chrome.extension.getURL('injected.js'));

введенный.js:

function main() {
     alert('Hello World!');
}

main();

Я бросил быстрый взгляд на альтернативы unsafeWindow на вики Greasemonkey, но все они выглядят довольно уродливо.Я совершенно на неправильном пути или мне следует присмотреться к этому более внимательно?

Вам стоит поискать, потому что это единственный доступный вариант.Я бы предпочел использовать взлом локации.

мойscript.user.js:

function myFunc(){
  alert('Hello World!');
}

location.href="javascript:(function(){" + myFunc + "})()"

example.com/mypage.html

<script>
myFunc() // Hello World!
</script>

Конечно, это некрасиво.Но это работает хорошо.


Метод Content Scope Runner, упомянутый Максом С.лучше, чем взлом местоположения, потому что его легче отлаживать.

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

Этот ответ добавит JavaScript на страницу непосредственно из вашего исходного кода.Он будет использовать ECMAScript 6 (ES6). литералы шаблона чтобы легко перенести многострочную строку JavaScript на страницу.

var script = document.createElement('script'); 
script.type = "text/javascript"; 
script.innerHTML = ` 
   function test() {
      alert(1);
   }
`;
document.getElementsByTagName('head')[0].appendChild(script);

Обратите внимание на обратные кавычки `` которые определяют начало и конец многострочной строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top