2009-10-30 20 views
11

Próbuję napisać skrypt użytkownika, który tworzy żądanie domeny AJAX.jQuery.getJSON wewnątrz skryptu użytkownika skryptu smarnego użytkownika

Zawarłem jQuery wewnątrz mojego skryptu przy użyciu @require i wszystko wydaje się działać dobrze aż do momentu, w którym próbuję uruchomić jQuery.getJSON.

Interfejs API, do którego uzyskuję dostęp, obsługuje jsonp, ale nadal pojawia się komunikat o błędzie stwierdzający, że jsonp123456789 nie został zdefiniowany.

Z tego, co udało mi się zebrać, wynika to z tego, że jQuery zapisuje odpowiedź jsonp bezpośrednio w nagłówku strony, która następnie staje się piaskownicą. Gdy to nastąpi, jQuery nie będzie już mogła uzyskać dostępu do wywołania zwrotnego, co spowoduje, że będzie niezdefiniowany. (Nie jestem w 100% w tej sprawie, ale wydaje mi się to prawdopodobne).

Czy istnieje sposób obejścia tego? Zasugerowano, że deklaruję funkcję wywołania zwrotnego w niebezpiecznym systemie Windows, ale nie jestem pewien, jak to zrobić i nie udało się go uruchomić.

Odpowiedz

16

Czy nie byłoby miło, gdyby jQuery używało wewnętrznie GM_xmlhttpRequest, aby można było korzystać z wygody metod jQuery i funkcjonalności Cross-site Greasemonkey? Jak zauważył mahemoff, Greasemonkey może pozwolić ci na zgłoszenie się bez polegania na JSONP i napotkaniu problemu wywołania zwrotnego, z którym musisz się zmierzyć, ale będziesz musiał sam sobie poradzić z zawartością JSON.

Napisaliśmy bibliotekę, która zrobi właśnie to: Greasemonkey/jQuery XHR bridge. Jeśli ten skrypt w twoim userpadzie, to wszystkie $.get i $.getJSON i $.post itp. Wywołania jQuery będą działały krzyżowo, bez polegania na takich technikach jak JSONP.

Jeśli więc używasz tego mostu i po prostu usuniesz z adresu URL kod ?callback=?, kod jQuery powinien działać bez modyfikacji. This blog post zawiera opis krok po kroku. Jeśli ktoś ma jakieś pytania, komentarze, zgłoszenia błędów lub sugestie dotyczące wtyczki mostu, proszę dać mi znać.

+1

Cześć Nick, Co ciekawe, natknąłem się na twój scenariusz, kiedy po raz pierwszy próbowałam rozwiązać ten problem, ale nie zdawałem sobie sprawy, że muszę usunąć wywołanie zwrotne, aby rzeczy działały i dlatego go porzuciłem. Dziękuję za odpowiedź na to pytanie i wyjaśnienie, co należy zrobić. –

+0

Chciałem tylko dodać, że to działało na przyjemności :) –

+0

Dziękuję za to, że moje zadanie było o wiele łatwiejsze! – GrayB

8

Obejście polega na użyciu polecenia GM_HttpRequest. Możesz uniknąć tego, zamiast JSONP dla żądań między domenami, ponieważ w przeciwieństwie do zwykłego XHR, GM_HttpRequest zezwala na wywołania między domenami. Chcesz coś takiego:

GM_xmlhttpRequest({ 
    method: "GET", 
    url: "http://example.com/path/to/json", 
    onload: function(xhr) { 
     var data = eval("(" + xhr.responseText + ")"); 
     // use data ... 
    } 
    }); 

Zauważ, że ten eSON jest JSON w najprostszy sposób. Jeśli chcesz bezpieczniejszego rozwiązania dla niezaufanego JSON, musisz dołączyć a small JSON-parsing library.

Niestety, musisz też wykonać całą operację na wrap a seemingly useless zero-duration setTimeout. Najłatwiej jest trzymać GM_xmlhttpRequest we własnej metodzie, a następnie uruchomić setTimeout (makeCall, 0) ;.

Możesz zobaczyć real example here.

+1

to faktycznie działało idealnie dla mnie. – roim

1

Jak wielu z was wie, Google Chrome nie obsługuje obecnie żadnych przydatnych funkcji GM_.

Jako taka, jest niemożliwe zrobić krzyż żądań strona AJAX z powodu różnych ograniczeń piaskownicy (nawet z wykorzystaniem wspaniałych narzędzi, takich jak James Padolsey's Cross Domain Request Script)

Potrzebowałem sposób, aby użytkownicy wiedzieli, kiedy mój Greasemonkey skrypt został zaktualizowany w Chrome (ponieważ Chrome też tego nie robi ...).I wymyślił rozwiązanie, które jest udokumentowane tutaj (i używane w moim Lighthouse++ skryptu) i wartości odczytu dla tych z was, którzy chcą sprawdzić swoje skrypty wersji:

http://blog.bandit.co.nz/post/1048347342/version-check-chrome-greasemonkey-script

Powiązane problemy