Итерация глобалов 'окна' - PullRequest
0 голосов
/ 29 декабря 2011

В обычном js можно перебирать объект окна -

<html><head><script>
function one(){
}
function two(){
  for (var i in window) {
    if (i=='one') {
      alert(i);//.......................shows 'one'
    }
  }
}
two();
</script></head></html>

Но в greasemonkey «окно» не содержит функций, даже функций, которые вы определили в скрипте GM:

// ==UserScript==
// @name           Page 3
// @namespace      http://xxxxxxxxxxxxxxxx
// @include        http://xxxxxxxxx.net/3.html
// ==/UserScript==
//
function one(){
}
function two(){
  for (var i in window) {
    if (i=='one') {
      alert(i);//.........shows nothing, only iterates native window props
    }
  }
}
two();

Да, я хочу повторить свои собственные функции, а не те, которые есть в unsafeWindow. Обратите внимание, что следующие работы, которые я не хочу делать:

window.one=function one(){
}
function two(){
  for (var i in window) {
    if (i=='one') {
      alert(i);//...........ta-da! 'one'
    }
  }
}
two();

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

Обновление: 'this' также не имеет доступа к функциям -

// ==UserScript==
// @name           Page 3
// @namespace      http://xxxxxxx.net
// @include        http://xxxx.com/*
// ==/UserScript==


function do_fixes(){
  var s='';
  for (var i in this) {
    if (i=='do_fixes') {
      alert('yes');
    }
  }
  if (window!=this) {
    alert('window!=this');
  }
}

do_fixes();
alert('this script ran!');

1 Ответ

1 голос
/ 29 декабря 2011

Глобальный объект должен быть доступен как this в глобальной области видимости и свободных функциях.На странице руководства Greasemonkey в среде Greasemonkey :

Если императив метаданных @unwrap присутствует в заголовке пользовательского сценария, весь сценарий будет заключен в анонимную функцию, чтобыгарантировать, что идентификаторы сценария не конфликтуют с идентификаторами, присутствующими в изолированной программной среде JavaScript Mozilla.Эта оболочка функции захватывает любые определения функций и var объявления переменных, сделанные (например, var i = 5;), в локальную область функции.Однако объявления, сделанные без var, в конечном итоге окажутся объектом скрипта this, который в Greasemonkey является глобальным объектом, в отличие от обычной объектной модели браузера, где объект window выполняет эту функцию.

Проблема заключается в том, что вам нужно развернуть сценарий для добавления ваших функций в глобальный сценарий (обратите внимание, что глобальные переменные доступны через this без развертывания).Обратите внимание, что @unwrap рекомендуется использовать только для отладки, поскольку ваши переменные и функции будут сталкиваться с переменными и функциями песочницы, если они имеют одинаковые имена.

Альтернативой является создание собственного объекта для использования вместо глобального объекта:

var global = {};

global.one = function () {...};
global.two = function (target) {
    for (p in global) {
        if (p == target) {
            GM_log("found " +target);
        }
    }
};
two('one');

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

...