[JS] jQuery 1.4.2 i Greasemonkey - jak pogodzić?


(Damgora) #1

Witam. Pytanie jak w temacie.

Próbowałem @require , ale nie działa z tą wersją biblioteki. Dopiero modyfikacje ze strony http://forum.jquery.com/topic/importing-jquery-1-4-1-into-greasemonkey-scripts-generates-an-error np. zamiana linijek 953-965 na:

var eventSupported = function( eventName ) {

        var

            el = document.createElement("div"),

            unwrappedEl = el.wrappedJSObject || el;

        eventName = "on" + eventName;


        var isSupported = (eventName in unwrappedEl);

        if ( !isSupported ) {

            el.setAttribute(eventName, "return;");

            isSupported = typeof unwrappedEl[eventName] === "function";

        }

        el = null;

        unwrappedEl = null;


        return isSupported;

    };

odnoszą skutek, ale wolałbym użyć pliku z jQuery udostępnionego na serwerach Google (którego nie mogę edytować).

Wiem, że można to też rozwiązać skryptem, który wstawiłby element script (np. http://joanpiedra.com/jquery/greasemonkey/), ale pomyśle o nim jeśli nie znajdzie się żaden prostszy sposób :wink:

Macie jakieś pomysły? Ktoś spotkał się z tym problemem i rozwiązał to inaczej?


(Spam) #2

Wpisz sobie na początku skryptu:

var $ = jQuery = unsafeWindow.jQuery;

albo otocz skrypt:

;(function($) {

// twój kod

})(unsafeWindow.jQuery);

I powinno zadziałać.

Na tej samej zasadzie działa ten skrypt, który podlinkowałeś, z tym, że tam jest tworzony dynamicznie element script jeszcze, tutaj zakładamy, że jQuery już jest.

Dzieje się tak dlatego, że Greasemonkey opakowuje dużo rzeczy w te swoje wrappery, niby dla bezpieczeństwa. Ale to tak naprawdę bezsensowne, bo co to za bezpieczeństwo, skoro blokuje się dostęp do elementów, a pozwala się na wywołania AJAX, i to cross-domain.


(Damgora) #3

Dzięki za wyjaśnienie, działa. Skrypt (raczej) będzie działał na stronach niewykorzystujących jQuery, więc oprócz wstawienia Twojego rozwiązania muszę jakoś dolączyć bibliotekę, ale tutaj jednak chyba najłatwiej będzie wstawić ten element script z odpowiednimi argumentami,

(bo jedyna alternatywa, która przyszła mi do głowy to wkleić cały kod jQuery w skrypcie :x ). No chyba, że da się prościej?


(Spam) #4

Nic innego nie przychodzi mi do głowy. Generalnie powinno się unikać dołączania tak dużych bibliotek do skryptów UserJS. Skrypty użytkownika zwykle przeznaczone są dla jednej lub dwóch konkretnych przeglądarek, a biblioteki typu jQuery uwzględaniają większość przeglądarek, w tym IE. Nie wspominając już o tym, jaki to narzut kodu.

Może lepiej poszukaj rozwiązania, które nie wymaga stosowania jQuery? Weź pod uwagę to, że nowoczesne przeglądarki dają więcej możliwości, niż faktycznie można wykorzystać w produkcji dla witryn, które muszą działać wszędzie. Przykładowo, Opera, Firefox i Safari/Chrome mają Selectors API do łatwego odnajdywania elementów – czyli tego, co jest ważną częścią jQuery (zresztą na tym częściowo się jQuery opiera, z tego co pamiętam).


(Damgora) #5

dzięki, tak naprawdę już tylko kombinuję bo boli mnie to, że zapis w jednej linijce (@require …) nie działa i trzeba trochę kombinować dookoła (tzn. pisać skrypt wstawiający skrypt :wink: ) zerknąłem na stronkę gm i piszą, że @require jest dopiero od którejś wersji, więc wcześniej taki sposób był pewnie normą.

Oczywiście pomysł z wstawieniem całego kodu był żartem :wink: