Greasemonkey: перехват встроенного события загрузки

Можно ли изменить/удалить событие <body onload="..."> через GreaseMonkey?

Код, о котором идет речь, таков:

<body onload="if (document.body.scrollIntoView &amp;&amp; (window.location.href.indexOf('#') == -1 || window.location.href.indexOf('#post') &gt; -1)) { fetch_object('currentPost').scrollIntoView(true); }">

Я хотел бы полностью предотвратить его выполнение (это раздражающая функция vBulletin для прокрутки к сообщению, даже если в URL-адресе нет хэша, который, по-видимому, также срабатывает при использовании кнопки «назад»).


person ThiefMaster    schedule 26.05.2012    source источник


Ответы (1)


Да, вы можете перехватить <body onload="..." ..., перезаписав его, как только DOM станет интерактивно доступен для Greasemonkey (вероятно, его можно заставить работать и в Chrome, но это не проверено).

Это работает:

// ==UserScript==
// @name        _Block inline onload function
// @namespace   _pc
// @include     http://YOUR_SERVER/YOUR_PATH/*
// @run-at      document-start
// ==/UserScript==

document.addEventListener ("readystatechange", FireWhenReady, true);

function FireWhenReady () {
    this.fired  = this.fired || false;

    if (    document.readyState != "uninitialized"
        &&  document.readyState != "loading"
        &&  ! this.fired
    ) {
        this.fired = true;

        document.body.onload  = function () {
            console.log ("body onload intercepted.");
        };
    }
}
person Brock Adams    schedule 26.05.2012