2010-09-14 16 views
6

Czekam na zbudowanie skryptozakładki między lokacjami, która otrzyma wyróżnione słowo, przekazuje ją do metody CodeIgniter (domain.com/controller/method) i zwraca definicję za pośrednictwem słownik API. Mam szkielet działający dobrze na pojedynczej domenie, ale zamierzam rozszerzyć go, aby korzystać z cross-domeny JSONP. Ale czuję się niejasna.JSONP dla międzywęzłówowego przewodnika zakładek

Wiem, że muszę załadować skrypt ze zdalnej lokalizacji i wstrzyknąć go w bieżącym kontekście. Sądzę, że muszę pobrać wyróżnione słowo na stronie, a następnie wywołać adres URL wyglądający jak domain.com/controller/method/word, aby uzyskać ten skrypt. Potem robi się mgliście.

Chyba mają zasadniczo dwa pytania:

  • Gdzie mogę to niezbędne do obsługi javascript analizowania i przekazywanie słowa poprzez XMLHttpRequest? Myślę, że będzie to SRC skryptu, który wprowadzę w nowym kontekście. Czy jest to w jakiś sposób w mojej odpowiedniej metody CodeIgniter? A może ten nowy skrypt pochodzi z losowej lokalizacji na tym samym serwerze, co odpowiednia metoda i po prostu do niej zadzwonić?

Odpowiedź: ta nie stanowi uzupełnienie XMLHttpRequest, to zamiast niej, tak że krok jest całkowicie usunięte. Nowy skrypt wywołuje metodę, przekazuje wymagane informacje za pośrednictwem ciągów zapytań i otrzymuje tablicę JSON w odpowiedzi.

  • Czy mam rację w zrozumieniu, że ostatecznie przekażę odpowiedź JSON z metody z powrotem jako word(json_encode($array));?

Odpowiedź: Tak, będę z powrotem przekazać, że jak callbackFunctionName(json_encode($array));.

Aktualizacja

I zawierał odpowiedź na dwóch moich trzech odpowiedzi powyżej. Jeśli ktoś potrafi dokładnie wyjaśnić rzeczy, oczywiście zaznaczę ich odpowiedź jako poprawną, inaczej rozwiążę moje potknięcia w odpowiedzi. Nadal nie mam pojęcia gdzie Piszę funkcję zwrotną i co będę robić z tym w JS.

Dziękuję bardzo za pomoc w tej sprawie.

Odpowiedz

7

Najpierw ustawić bookmarkletu z linkiem można spaść na pasku zakładek:

<html> 
<head></head> 
<body> 
    <a href="javascript:(function(src, cb){var s = document.createElement('script');s.charset = 'UTF-8';document.body.insertBefore(s, document.body.firstChild);s.src = src;if(typeof cb === 'function'){s.onload = cb;s.onreadystatechange = function(){(/loaded|complete/).test(s.readyState)&&cb(s);};}return s;}('http://github.com/pure/pure/raw/master/libs/pure.js', function(e){alert('loaded');}))">load</a> 
</body> 
</html> 

zastąp adres URL przez skrypt, to zostanie załadowany i uruchomiony na stronie gospodarza.

Jednak znajduje się teraz na stronie hostowanej i nie może połączyć się z serwerem pod numerem XMLHTTPRequest, ponieważ domeny są niezgodne.
Nadchodzi JSONP.

w załadowanym skrypcie, można umieścić funkcję np function srvCallback(json){...}

Jeśli chcesz połączyć się z serwerem można wstrzyknąć go jako skrypt stosując podobną funkcję jak w bookmarklet powyżej:

function jsonp(src){ 
    var s = document.createElement('script'); 
     old = document.getElementById('srvCall'); 
    old && document.body.removeChild(old); 
    s.charset = 'UTF-8'; 
    s.id = 'srvCall'; 
    document.body.insertBefore(s, document.body.firstChild); 
    s.src = src + '?' + new Date().getTime(); 
} 

wstrzyknąć Państwa potrzeb, np

jsonp('http://domain.com/controller/method/word') 

serwer powinien odpowiedzieć coś takiego:

srvCallback({word:'hello'}); 

Wreszcie funkcja srvCallback jest wywoływana automatycznie, wewnątrz funkcji otrzymujesz JSON i wyświetlasz wynik użytkownikowi.

+0

Hej Mic, jestem trochę zdezorientowany. To jest bookmarklet, o którym mówimy, więc jak mógłbym umieścić na początku skrypt w ciele? Cokolwiek chcę użyć, muszę go wstrzyknąć, prawda? –

+0

Mam nadzieję, że to drugie ujęcie pomoże. – Mic

+0

Hej Mic, twoja pomoc mnie uruchomiła! W mojej skryptozakładce wstrzyknąłem swój skrypt pomocniczy za pomocą funkcji samoczynnego wykonywania, a w tym skrypcie pomocniczym zawarłem wszystkie moje JS i funkcję samo-wykonującą, aby wywołać moją metodę, która zwraca metodę ({jsonData}). W tym samym skrypcie pomocniczym mam funkcję o nazwie metoda (jsonp), która odbiera i przetwarza dane. Pozostało mi tylko jedno pytanie: dlaczego funkcja oddzwaniania przy pierwszym wstrzyknięciu? ** –