2012-01-19 1 views
4

Я пишу расширение Safari, которое добавляет некоторые функции к веб-странице, которой у меня нет. Я хотел бы, чтобы на моей странице JavaScript с JavaScript появилась возможность запускать некоторые функции JavaScript, которые использует страница хоста, но она не работает. На консоли я получаю сообщение ReferenceError: Can't find variable: function_name.Выполнение хост-скрипта с введенной страницы

Мой скрипт указан как конечный сценарий, поэтому необходимо загрузить всю страницу. Эта функция также вызывается из обработчика onclick() на странице, например, так:

onclick="function_name($(this).up());" 

я могу получить ссылку на эту страницу элемент, но когда я называю element.onclick() я получаю другую ошибку: TypeError: 'undefined' is not a function (evaluating '$(this).up()').

Как ни странно, когда я вызываю функцию JavaScript из AppleScript (do JavaScript "function_name()" in page), он отлично работает. Как я могу вызвать эти функции?

ответ

2

Я могу расширить ответ от canisbos. Вы можете связаться со вставленным скриптом с помощью функции PostMessage.

впрыскивается сценарий:

//insert script to page 
var myScriptElement = document.createElement('script'); 
myScriptElement.innerHTML = 
    'window.addEventListener("message", function(e) {' + 
    ' if (e.data.msg == "do") {' + 
    ' foo(e.data.info);' + 
    ' postMessage({msg: "done", info: "answer"}, "*");' + 
    ' };' + 
    '}, false);' 
document.querySelector('head').appendChild(myScriptElement); 

//add answers listener 
window.addEventListener('message', function(e) { 
    if (e.data.msg == 'done') { 
    console.log(e.data.info); 
    }; 
}, false); 

//add the testing function on the body click 
document.addEventListener('click', function (e) { 
    //call inserted script 
    postMessage({msg: 'do', info: 'from inject'}, '*'); 
}, false); 

Тест HTML-страница:

<html> 
<script> 
    function foo(text) { 
    console.log(text); 
    }; 
</script> 
<body> 
    <button id='button' onclick='foo("from page")'>test</button> 
</body> 
</html> 
2

Это не работает, потому что вложенный сценарий расширения изолирован песочницей; он не может видеть глобальные объекты страницы, кроме DOM (и наоборот). Путь к этому ограничению безопасности состоит в том, чтобы вложенный сценарий создал элемент <script> с необходимыми инструкциями и вставлял его в документ. Например:

var myScriptElement = document.createElement('script'); 
myScriptElement.innerHTML = 'alert("Page is using jQuery " + $.fn.jquery)'; 
document.querySelector('head').appendChild(myScriptElement); 

Однако вставленный скрипт также не будет иметь доступа к объектам вложенного скрипта. Так, например, если вы попытаетесь получить доступ к объекту расширения safari из вставленного скрипта, вы получите опорную ошибку.

+0

У меня есть какой-либо способ общения с вставленным сценария? Это полезная информация и объясняет, что происходит, но мне бы очень понравилось. – Dov

+0

Вы можете использовать DOM для своего рода обмена между вложенным скриптом (расширением) и вставленным скриптом. Если вы хотите передать значение из вставленного сценария в инъецированный скрипт или наоборот, первый скрипт мог бы установить атрибут для элемента в документе, используя element.setAttribute(), а в какой-то момент второй скрипт мог бы прочитать он использует element.getAttribute(). Например, вы можете использовать: document.documentElement.setAttribute ('my_attr', '999') , а затем для получения значения: document.documentElement.getAttribute ('my_attr') – canisbos

+0

Но она должна была бы опроса на некотором интервале? – Dov

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

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