1

Тема: Greasemonkey/Scriptish: Автообновление Ajax страниц

Доброго дня. Пишу небольшой скриптик для Firefox+Greasemonkey/Scriptish, но столкнулся с проблемкой.

Страница Ajax-овая. И при обновлении контента, мои изменения на странице исчезают.

Пример
Вот сайт http://juicystudio.com - небольшая страница для тестирования Ajax.
Пишу для нее тестовый код который просто меняет цвет текста.

// ==UserScript==
// @id             test@js
// @name           for http://juicystudio.com
// @include        http://juicystudio.com/*
// ==/UserScript==
(function () {
    document.getElementById('update').setAttribute('style','color:red');
})();

При клике на ссылку [Generate random fact], элемент <p> именяет свое содержимое и весь мой красный текст идет к черту.

Я придумал 2 варианта.
1. Это использовать setInterval(...), то есть через какой то промежуток времени запускать мою функцию.

// ==UserScript==
// @id             test@js
// @name           for http://juicystudio.com
// @include        http://juicystudio.com/*
// ==/UserScript==
(function () {
  setInterval(function(){document.getElementById('update').setAttribute('style','color:red')},2000);
})();

Но мне почему то кажется что это плохой подход, напрягать браузер скриптом не стоит.

2. Еще как вариант это повесить на сылку свой обработчик.

// ==UserScript==
// @id             test@js
// @name           for http://juicystudio.com
// @include        http://juicystudio.com/*
// ==/UserScript==
(function () {
  document.getElementById('fact').addEventListener( "click", function(){setTimeout("document.getElementById('update').setAttribute('style','color:red')",2000)}, false);
})();

Это неплохо когда всего 1 ссылка на странице. А если их тьма? Тогда придется вешать на все.

Вот хотелось бы спросить. А есть еще какие то варианты, что бы добиться моей цели?

Нас невозможно сбить с пути, нам пофигу куда идти.

2

Re: Greasemonkey/Scriptish: Автообновление Ajax страниц

            var objCurrent = document.getElementById('update');
            var objReplacement = document.createElement('p');

            objReplacement.setAttribute('id', 'update');
            objReplacement.tabIndex = -1;
            objReplacement.appendChild(document.createTextNode(strResult));

            if (objCurrent)
                objCurrent.parentNode.replaceChild(objReplacement, objCurrent);

Проблема в этих строках - происходит замена одного элемента другим. Если сайт Ваш - перепишите эти строки, так чтобы менялось ТОЛЬКО содержимое, а не весь элемент. Иначе - ищите пути смены стиля не у старого элемента, а у нового. Есть такая возможность в GreaseMonkey?

( 2 * b ) || ! ( 2 * b )

3

Re: Greasemonkey/Scriptish: Автообновление Ajax страниц

Если сайт был бы мой, то проблем бы не было. 8)
GreaseMonkey же помогает как раз с чужими сайтами. Наверное мне стоило начать с того, что бы вкратце рассказать что же за расширения такие GreaseMonkey/Scriptish - собственно они внедряют на сторонние сайты свой код javascript, что позволяет динамически менять любой сайт, само собой только для своего браузера.

Так что есть возможность влиять только на уже созданную страницу.

То что вы написали, я понимаю. Хотелось узнать может есть некая хитрость/хак реализующая нечто:

body.onreload(...) - то есть отрабатывающая при обновлении страницы.

Нас невозможно сбить с пути, нам пофигу куда идти.

4

Re: Greasemonkey/Scriptish: Автообновление Ajax страниц

Я знаю, что такое GreaseMonkey, хотя ни разу не пользовался им.

GreaseMonkey/Scriptish ... внедряют на сторонние сайты свой код javascript

. Я бы не стал так утверждать. Скорее - выполняют дополнительный код для определенных сайтов. Ну, это уже тонкости...

Почитайте документацию к расширениям. Поищите события DOM. Может быть там есть что-то называемое DOMNodeInserted/DOMNodeInsertedIntoDocument.

( 2 * b ) || ! ( 2 * b )

5

Re: Greasemonkey/Scriptish: Автообновление Ajax страниц

Попробуйте что-нибудь эдакое. Писал на коленке. Так что если сработает, засчитайте это как мой первый рабочий скрипт для GreaseMonkey )))

// ==UserScript==
// @id             test@js
// @name           for http://juicystudio.com
// @include        http://juicystudio.com/*
// ==/UserScript==
(function()
{
    document.addEventListener('DOMNodeInsertedIntoDocument', function(e)
    {
        e = e || window.event;
        var s = e.target;
        if ( s.id == 'update' ) {
            s.style.color = '#ff0000';
        }
    }), false);
})();
( 2 * b ) || ! ( 2 * b )

6

Re: Greasemonkey/Scriptish: Автообновление Ajax страниц

Ухты елки-палки.
Заработало, только не с DOMNodeInsertedIntoDocument, а с DOMNodeInserted. А я не слышал про такую магию. Благодарю, Rumata. Буду тестить, ковырять.

Нас невозможно сбить с пути, нам пофигу куда идти.

7

Re: Greasemonkey/Scriptish: Автообновление Ajax страниц

С Вами и я узнал про сии события, описанные в DOM Level 2. ))).

( 2 * b ) || ! ( 2 * b )

8

Re: Greasemonkey/Scriptish: Автообновление Ajax страниц

DnsIs пишет:

собственно они внедряют на сторонние сайты свой код javascript,

Всё же нет. Они встраивают в отдаваемый браузеру текст html-страницы своё содержимое по заданным правилам. Сайт об этом ничего не знает.

Update: собственно, Rumata уже сказал.

9 (изменено: DnsIs, 2011-09-18 11:30:46)

Re: Greasemonkey/Scriptish: Автообновление Ajax страниц

2alexii конечно вы правы, и я об этом прекрасно знаю. Просто не умею выражать мысли.

Нас невозможно сбить с пути, нам пофигу куда идти.

10

Re: Greasemonkey/Scriptish: Автообновление Ajax страниц

DnsIs пишет:

…Просто не умею выражать мысли.

Сам такой .