Ваш сценарий будет работать, если в глобальной области страницы определено toAlert
.
В Chrome расширение / Greasemonkey JavaScript не может совместно использовать переменные или замыкания со страницей JavaScript.
Вот почему выне может внедрить эту функцию напрямую, из области расширения в область страницы, но должен воссоздать ее из исходной строки.
Это означает, что если вы создаете функцию в области страницы, любые переменные или функцииВаша функция должна либо:
- Уже присутствовать в глобальном масштабе на исходной странице.
Или - Сценарий также добавляется на исходную страницу.
Например, изменение вашего кода следующим образом ...
//-- Must recreate the variable that the function requires.
scriptStr = 'var toAlert="' + toAlert +'";';
//-- Now the function.
scriptStr += '(' + source.toString() + ')();'
var script = document.createElement('script');
script.textContent = scriptStr;
... работает, но этот подход явно запутывается.
Умная вещь, которую нужно сделать, это либо:
(A) сохранить весь ваш JavaScript в расширении;не взаимодействуйте с JavaScript страницы.
Или (B), если вам нужно взаимодействовать с JS страницы или загружать библиотеки, такие как jQuery, а затем поместить все вашего кода в одну основную () и запишите его на исходную страницу.
Примерно так:
function localMain ()
{
/*--- Put EVERYTHING inside this wrapper, functions and variables.
Call or use nothing else that's defined in the GM script here.
Can use objects in the source page's scope, though.
*/
}
//--- Now create the function in the page's scope and run it.
var scriptNode = document.createElement ("script");
scriptNode.textContent = localMain.toString() + "\n localMain ();";
document.head.appendChild (scriptNode);
Обратите внимание, что если вы также загружаете библиотеку в область видимости страницы, то вам может понадобитьсязадержка запуска localMain()
с использованием таймера и проверки этой библиотеки.