Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JS] Funkcja w funkcji
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Puszy
Witam, tworzę kilka prostych funkcji do obsługi AJAX i mam problem który wiąże się z samym JavaScriptem. Otóż chciałbym przekazać funkcję do funkcji tak aby wywoływała się w funkcji, bez sensu napisane więc wytłumaczę na przykładzie:

tworzę obiekt XHR
Kod
var karmian    =    new XMLHttpRequest();


oraz funkcję do wysłania zapytania
Kod
function karmian_send_get(URL, GET_STRING){
    karmian.open('GET', URL+'?'+GET_STRING);
    karmian.onreadystatechange    =    karmian_receive_get;
    karmian.send(null);
}


problemem jest to że chciałbym aby fragment:
Kod
karmian.onreadystatechange    =    karmian_receive_get;

był dynamiczny(?)

Chcę dodać do funkcji karmian_send_get(); parametr którym będzie nazwa funkcji którą chciałbym wywoływać.

coś na zasadzie:
Kod
function karmian_send_get(URL, GET_STRING, FUNKCJA_DO_WYWOLANIA){
    karmian.open('GET', URL+'?'+GET_STRING);
    karmian.onreadystatechange    =    FUNKCJA_DO_WYWOLANIA;
    karmian.send(null);
}


analogicznie mógłbym wykonać kilka różnych wywołań tej samej funkcji:
Kod
karmian_send_get('http://localhost/a.php', 'a=1', wyswietl_w_div());
karmian_send_get('http://localhost/a.php', 'a=1', alert());
karmian_send_get('http://localhost/a.php', 'a=1', inna_funkcja());


Z góry dziękuję za pomoc. Pozdrawiam.
Crozin
No to samą funkcję masz już dobrze napisaną, jedynie w użyciu powinno być ....'a=1', wyświetl_w_div); (zauważ brak nawiasów po nazwie funkcji).
Puszy
Cytat(Crozin @ 11.05.2012, 12:43:59 ) *
No to samą funkcję masz już dobrze napisaną, jedynie w użyciu powinno być ....'a=1', wyświetl_w_div); (zauważ brak nawiasów po nazwie funkcji).


ale będę chciał też przesyłać parametry, napiszę to troszkę inaczej:

Kod
var karmian    =    new XMLHttpRequest();

function glowna(parametr_1, funkcja_do_wywolania){
    karmian.open('GET', parametr_1);
    
    karmian.onReadystatechange    =    funkcja_do_wywolania;
    
    karmian.send(null);    
}


function wpisz_w_div(div_id){
    document.getElementById(div_id).innerHTML    =    'Lorem...';
}

function zmien_klase(div_id){
    document.getElementById(div_id).setAttribute('class', 'red');
}



wywołuje to tak:
Kod
glowna('http://localhost/plik.php', wpisz_w_div('div_numer_18'));
glowna('http://localhost/plik.php', zmien_klase('div_numer_89'));


tak miałoby to wyglądać
Crozin
W takim przypadku będziesz musiał przekazać jako argument funkcję, która to dopiero wywoła Twoją funkcję z danymi parametrami, czyli:
[JAVASCRIPT] pobierz, plaintext
  1. ...'a', function() {
  2. wpisz_w_div('abc', 'def');
  3. });
[JAVASCRIPT] pobierz, plaintext
Puszy
Ale ja nie chcę ją wywołać tylko wstawić za znakiem przypisz

tutaj:
Kod
karmian.onReadystatechange    =    funkcja_do_wywolania;


W miejscu funkcja_do_wywolania chce podstawiać rozne funkcje i dopiero tutaj maja być wywołane.

Rozwiązaniem byłby switch, ale gdy funkcji będzie 300, switch staje się nie czytelny i (dla mnie) bez sensu.

W ogóle wydaje mi się że się nie rozumiemy. Zawsze miałem problem z opisem problemu. smile.gif
Crozin
Dobrze się rozumiemy. Funkcję glowna(param1, funkcja_do_wywolania) masz już dobrze napisaną - możesz do niej podać dowolną funkcję. Teraz jeżeli byś chciał by w wyniku działania kodu wywołała się jakaś funkcja (podana przez Ciebie) z danym argumentem musisz wykonać "trik" w postaci przekazania anonimowej funkcji pozbawionej argumentów, której jedynym zadaniem będzie odpalenie docelowej funkcji z danymi argumentami - tak jak Ci to pokazałem wcześniej. Czyli ostatecznie kod funkcji glowna() nie musi się zmieniać, a przykładowe wywołanie to:
[JAVASCRIPT] pobierz, plaintext
  1. glowna('http://localhost/plik.php', function() {
  2. wpisz_w_div('div_numer_18');
  3. });
  4.  
  5. // Jakbyś to sobie chciał robić na kolejne kroki:
  6. var wpiszWDiv18 = function() {
  7. wpisz_w_div('div_numer_18');
  8. };
  9.  
  10. glowna('http://...', wpiszWDiv18);
[JAVASCRIPT] pobierz, plaintext
Puszy
Dzięki wielkie, wszystko działa jak należy. Wygląda nie za dobrze ale dorzucę jQuery i będzie ok.


gotowy działający kod:
Kod
<html>
    <head>
    
        <script type="text/javascript">

            var karmian    =    new XMLHttpRequest();
        
            function karmian_send_get(URL, GET_STRING, FUNCTION_TO_EXECUTE){
                karmian.open('GET', URL+'?'+GET_STRING);
                karmian.onreadystatechange    =    FUNCTION_TO_EXECUTE;
                karmian.send(null);
            }

            function karmian_receive_get_1(){
                if(karmian.readyState == 4){
                    document.getElementById('cont1').innerHTML    =    karmian.responseText;
                }
            }

            function karmian_receive_get_2(){
                if(karmian.readyState == 4){
                    document.getElementById('cont2').innerHTML    =    karmian.responseText;
                }
            }
        
        </script>
    
    </head>
<body>

    <div id="box">

        <input type="button" value="test1" id="but1" onClick="karmian_send_get('http://localhost/workspace/WebService/ajax.php', 'a=133&b=test1', function(){karmian_receive_get_1();});" />
        <input type="button" value="test2" id="but2" onClick="karmian_send_get('http://localhost/workspace/WebService/ajax.php', 'a=515&b=test2', function(){karmian_receive_get_2();});" />
    
        <br />
    
        <div id="cont1"></div>
        
        <br />
        
        <div id="cont2"></div>
    
    </div>
    
</body>
</html>


i plik php:
  1. <?php
  2.  
  3. print_r($_GET['a'].'<br />'.$_GET['b']);
  4.  
  5. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.