Полное описание задачи.
Есть такая страница которая грузится в FF с какого-то сайта.
<html>
<head>
<title>Test page 1</title>
<script>
function hiName() {
alert("Hi Nickolay!");
}
</script>
</head>
<body onLoad="hiName()">
<p>This is the body text.
</body>
</html>
Задача: Средствами браузера изменить содержимое скрипта таким образом, чтобы после загрузки страницы
в окне alert функцией "hiName()" был выведен текст "Hi Vladimir!", а не "Hi Nickolay!".
Очевидно, что заменить "Nikolay" на "Vladimir" нужно после окончания загрузки страницы в браузер, но перед
тем как будет выполнена функция "hiName()" по событию "onLoad" тэга "body".
Пытаемся решить эту задачу с помощью небольшого расширения к FF.
Гвоздем расширения является файл sample.xul в котором находится скрипт расширения.
<?xml version="1.0"?>
<overlay id="sample"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<browser type="content-primary"/>
<script type="application/x-javascript">
<![CDATA[
function repl() {
var s=content.document.getElementsByTagName("script");
for (i=0;i<s.length;++i) {
node=s[i];
if (node.text) {
t=node.text;
e=t.indexOf('Nikolay');
if (e > 0) {
z=t.replace('Nikolay','Vladimir');
node.text=z;
}
}
}
}
window.addEventListener("load", repl, true);
]]>
</script>
<statusbar id="status-bar">
<statusbarpanel id="my-panel" label="Sample extension work."/>
</statusbar>
</overlay>
В результате текст скрипта в дереве DOM содержит "Vladimir", но все равно в главной странице работает скрипт
с "Nickolay".
Строки
ex="<script language=javascript1.2>"+z+"hiName()</script>";
eval(ex);
вставленные после строки
node.text=z;
нечего не изменили.
Метод "replaceChild" вместо "node.text=z" дает тот же результат.
Вроде как все заколдованное.
Как расколдовать и заставить его делать то, что нужно?
|