О стрельбе дважды:
Если страница содержит <iframe>
с, пользовательский скрипт будет запускаться в каждом из них.
Вам нужно определить, находитесь ли вы внутри <iframe>
или нет. Самый простой способ запустить только на главной странице, а не в фреймах, это заключить весь код в код:
if(top==self)
{
...
}
Чтобы увидеть, есть ли на странице <iframe>s
(жестко закодированные в HTML или динамически генерируемые), я всегда использую AdBlock Plus (диалог «Открыть блокируемые элементы»).
Однако я не уверен, почему второе «внутреннее» предупреждение не запускается. Я создал простую HTML-страницу, содержащую <iframe>
, и я получил два оповещения.
О скрипте вообще:
Вы делаете двойную работу здесь. Вам не нужно все оборачивать, чтобы выполнить скрипт. Greasemonkey выполняет строки кода после загрузки страницы (DOMContentLoaded
). Таким образом, вам не нужно создавать тег <script>
, устанавливать его тело и добавлять к документу. Вы можете просто написать
document.getElementById("postingHtmlToolbar").firstChild.innerHTML += ...
и он должен делать то, что вы хотите (вам вообще не нужна функция contentEval
).
У меня нет блога на блоггере, поэтому я не могу войти в систему и увидеть URL-адрес и проблемное поведение, но для отладки достаточно пошаговой игры с кодом.
Редактировать 2:
Похоже, вы должны изменить firstChild
на firstElementChild
.
Существует свойство innerHTML
в Element
(начиная с Firefox 3.5), но не в Node
.
Да, это действительно противоречиво и раздражает время от времени. Недавно я столкнулся с подобной проблемой.
Редактировать 3:
Там есть пара вещей. Пожалуйста, не говорите мне, что это не работает до сих пор:)
var func = function() {
var obj = document.getElementById("postingHtmlToolbar");
if(obj !== null){ // only if object exists, so we don't have errors
//alert(obj);
obj.style.display = 'block'; // it's hidden by default
obj.firstElementChild.innerHTML += "FOO";
}
}
window.setTimeout(func, 3000); // execute with delay -- let's give Google's JS time to be loaded first