Дурацкая функция js не определена

#javascript-events #google-chrome-extension #javascript

#javascript #google-chrome-расширение #dom-события

Вопрос:

Я пишу расширение для Chrome в фоновом режиме.html-страница, она вводит js-файл с помощью этой команды:

 chrome.tabs.executeScript(null, {file: "mod.js"});
  

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

Я меняю innerHTML главной страницы Facebook, div, который содержит «главные новости» и «самые последние»

Я вставляю этот html:

 "<a href='#' onclick='thisIsUndefined()'>
  <span class='someClass'>
    Better feed
  </span>
</a>"
  

И прямо в js-файле, который вводится, thisIsUndefined прекрасно указано как:

 function thisIsUndefined () {
    alert("is it working yet?");
}
  

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

Точная ошибка:

Ошибка неперехваченной ссылки: это неопределенное значение не определено

Вот весь файл для справки:

http://texthmu.com/Devin/HMU ext/mod.js

Не могли бы вы порекомендовать какие-либо ключевые слова, такие как ‘global’ или ‘var’, которые могли бы исправить определение?

Комментарии:

1. Является ли функция глупой?

2. О, в то время это действительно было так 🙂

Ответ №1:

Скрипты на странице и скрипты содержимого изолированы. Они взаимодействуют с одним и тем же DOM, но не напрямую с переменными друг друга. Когда вы добавляете onclick , он будет искать эту функцию в скриптах сайта. Лучшим способом сделать это было бы использовать document.createElement , а затем использовать onclick or addEventListener для присоединения вашей функции. Если вы хотите пройти innerHTML маршрут, сначала добавьте его в DOM, затем найдите его и прикрепите свое событие.

http://jsfiddle.net/EjYpQ/

Комментарии:

1. Это именно то, что нужно! Очень четкий!

Ответ №2:

Вам немного не повезло с этим из-за модели выполнения Chrome:

Скрипты содержимого выполняются в особой среде, называемой изолированным миром. У них есть доступ к DOM страницы, на которую они вводятся, но нет доступа к каким-либо переменным JavaScript или функциям, созданным страницей. Для каждого скрипта содержимого это выглядит так, как будто на странице, на которой он запущен, не выполняется другой JavaScript. То же самое верно и в обратном порядке: JavaScript, запущенный на странице, не может вызывать какие-либо функции или обращаться к каким-либо переменным, определенным скриптами содержимого.

(выделено жирным шрифтом)

Источник:http://code.google.com/chrome/extensions/content_scripts.html#execution-environment

Ответ №3:

Это лучшее решение, которое я нашел:

 $("#elementID").click(function() {
    myFunc();
});