2016-12-15 8 views
0

Я хотел бы иметь возможность выставлять переменную, ограниченную функциями, которая является частью javascript веб-сайта (не моего).Изменить javascript, чтобы открыть переменную с функциональной областью

Вот упрощенный пример:

function addHooks(e, t, n, i) { 
    var props = {     // Would like to expose this 
     update: function() { ... }, 
     remove: function() { ... }, 
     find: function() { ... }, 
    }; 
    ... 
} 

В приведенном выше примере, я хотел бы выставить переменную props так, что мой webextension может затем получить доступ к этому, чтобы изменить поведение веб-сайта. Обратите внимание, что веб-сайт, который обслуживает этот JS-файл, не под моим контролем, и поэтому я не могу просто изменить исходный файл для экспорта этой переменной. Тем не менее, я полностью открыт для изменения окончательного кода, который запускает браузер (я просто не знаю, как это сделать). Файл javascript, содержащий функцию addHooks, добавляется динамически с помощью XHR.

Хотя я понятия не имею, как это осуществить программно, у меня был некоторый успех, установив точку останова, а затем выпустив window.siteController = props в консоли разработчика браузера. К сожалению, ручное вмешательство пользователя - это не то, что я могу упаковать и распространять.

Один из методов, с которым я работал, - это идея сделать запрос AJAX для JS-файла, изменив его содержимое скрипта и добавив его на страницу.

Существует ли канонический программный способ, с помощью которого может быть выставлена ​​переменная с функцией?

+0

Добавить 'this.props' – azad

+0

Источник javascript не является моим и, следовательно, недоступен для меня, чтобы изменить его на уровне источника. –

+0

вы не можете получить доступ к переменной за пределами ее области ... – Punit

ответ

-1

EDIT: Спасибо Makyen, который указал на мою ошибку. Очевидно, вы могли бы это сделать, если переопределить функцию в скрипте страницы и вставить ее как элемент сценария. (См. Комментарий для двух ссылок).

Просто убедитесь, что ваш <script> элемент вставляется после первоначального определения, а затем вы можете либо return props в конце функции, или использовать this.props и использовать функцию либо в виде конструктора или с помощью функции call, передавая объект который добавит свойство реквизита.


Старый ответ (__ wrong__ видимо)

Короткий ответ: вы не можете.

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

И вы не можете изменить JavaScript сайта. Как расширение Firefox или Chrome (и, возможно, те же самые огни для других браузеров, я не уверен), вы даже не можете получить доступ к этой функции (не говоря уже о ее внутренних переменных). Я хочу сказать, что вы не можете даже назвать это из расширения его кода сайта.

сценарии содержание не может видеть переменные JavaScript, определенных сценариев страницы More info and source

Firefox/Chrome запускает свой код JavaScript в параллельной среде, изолированной от окружающей среды веб-сайта. Это, конечно, по соображениям безопасности.Это также помогает вам развиваться, не зная точную внутреннюю работу каждого сайта, на который может быть введен ваш код, поскольку вам не нужно беспокоиться о конфликтах именования (что было бы невозможно, если бы не разделение сред). Единственное, что у вас есть, это доступ к DOM, благодаря которому вы можете собирать информацию, изменять веб-сайт и даже разговаривать с веб-сайтом в некоторых случаях (веб-сайт должен следовать протоколу, который вы также решаете).

+0

Оба Firefox и Chrome имеют схожие возможности в этом отношении. Расширение имеет доступ чуть больше, чем просто DOM. Вы ограничили свое мышление узким представлением о возможностях расширения. Расширение * может * вызывать функции страницы, вам просто нужно сделать это из сценария страницы.Существует несколько вопросов/ответов (например, [этот] (http://stackoverflow.com/a/40320909/3773011) и [этот] (http://stackoverflow.com/a/40572286/3773011) , как с прошлых полутора месяцев). – Makyen

-1

Если это переменная объекта реквизита, которую вы хотите открыть, вы можете вернуть ему весь объект из functin, например, в закрытие. Или вы могли бы просто объявить закрывающую функцию как функцию конструктора, установить реквизиты как this.props, а затем вызвать ту же функцию в другом месте, используя новое ключевое слово. Дайте мне знать, если это помогает

+0

Как я могу изменить его для достижения этого? Скрипт добавляется на страницу через 'XHR'. Как я уже упоминал, исходный код сценария не под моим контролем. –

+0

Тогда возможно только, если вы можете изменить реквизиты на this.props и получить это в другом functon –

 Смежные вопросы

  • Нет связанных вопросов^_^