Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP]Wykonywanie skryptu php po wprowadzeniu danych
Forum PHP.pl > Forum > Przedszkole
CMG
Czy jest możliwe za pomocą skryptu javascript wykonywać jakiś skrypt php w miare wpisywania danych w pola tekstowe na stronie?

Powiedzmy że mam formularz z dwoma polami tekstowymi

  1. <form method="post" action="index.php?licz=1">
  2. <input type="text" name="pole1">
  3. <input type="text" name="pole2">
  4. <input type="submit">
  5. </form>


Taki skrypt normalnie wykonałby się dopiero gdy wcisnę przycisk Submit, na wielu stronach widziałem np. dynamiczne wyszukiwarki, które szukają jakichś wyników w bazie na bierząco w miarę wprowadzania liter w pole tekstowe - to co ja chcę zrobić to ma działać mniej więcej na tej samej zasadzie.

Chcę pominąć przycisk Submit, czyli jeżeli wpiszę jakąś liczbę w polu1 lub polu2 to skrypt js uruchamia skrypt php i zwraca wynik, ewentualnie mogłoby być jakieś opóźnienie np. wykonaj skrypt po 1 sekundzie od skończenia wprowadzania danych w pole1 i pole2

Jeżeli jest to możliwe to proszę o nakierowanie jakby to można zrobić gdyż jestem totalnie zielony w JS, może już ktoś kiedyś widział taki skrypt albo sam robił do czegoś..
Helid
Odpowiedź: Ajax + jQuery

Przydatne funkcje
http://api.jquery.com/keyup/
http://api.jquery.com/jQuery.get/
http://api.jquery.com/val/

Rozwiązanie
Przez keyup monitorujesz czy klawisz został naciśnięty, jeśli tak to pobierasz wartość przez funkcje val a następnie wysyłasz przez ajax zapytanie GET do skryptu PHP który coś zwraca.
CMG
Nie byłoby łatwiej zwykłym onchange()? Tylko nie wiem czy da się monitorować kilka pól i dodać do tego jakiś timeout

Ale wygooglałem funkcje o których napisałeś i chyba znalazłem skrypt, który powinien mi pasować, tylko jak zwykle mam z problem ze zrozumieniem tego dziwnego js

Oto kod, który skleiłem, w pewnym sensie działa, po wpisaniu tekstu w pole1 czeka 1500 ms i submituje formularz, tylko że reakcja jest tylko jeśli wpisze dane w pole1.

Zapewne zmiany w samym skrypcie jQuery nie są potrzebne, głównie chodzi o to wywołanie, które umieściłem pod formularzem.

Czy mógłby ktoś przerobić to wywołanie tak żeby reakcja i timeout były wspólne dla wszystkich 5 pól (no i oczywiście żeby funkcja clearPreviousTimeout() działała gdy są wprowadzane zmiany w jakimkolwiek z tych 5 pól)

Kod
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

<script>
jQuery.fn.handleKeyboardChange = function(nDelay)
{
    function shouldIgnore(event)
    {
        var mapIgnoredKeys = {
             9:true, // Tab
            16:true, 17:true, 18:true, // Shift, Alt, Ctrl
            37:true, 38:true, 39:true, 40:true, // Arrows
            91:true, 92:true, 93:true // Windows keys
        };
        return mapIgnoredKeys[event.which];
    }

       function fireChange($element)
    {
        if( $element.val() != jQuery.data($element[0], "valueLast") )
        {
            jQuery.data($element[0], "valueLast", $element.val())
            $element.trigger("change");
        }
    }

    var timeout = 0;
    function clearPreviousTimeout()
    {
        if( timeout )
        {
            clearTimeout(timeout);
        }
    }

    return this
    .keydown(function(event)
    {
        if( shouldIgnore(event) ) return;
        clearPreviousTimeout();
        return null;
    })
    .keyup(function(event)
    {
        if( shouldIgnore(event) ) return;
        clearPreviousTimeout();
        var $self = $(this);
        timeout = setTimeout(function(){ fireChange($self) }, nDelay);
    })
    .change(function()
    {
        fireChange($(this));
    })
   ;
}
</script>


<form method="post" name="form" >
<input type="text" id="pole1" name="pole1">
<input type="text" id="pole2" name="pole2">
<input type="text" id="pole3" name="pole3">
<input type="text" id="pole4" name="pole4">
<input type="text" id="pole5" name="pole5">
</form>

<script>
$("#pole1").handleKeyboardChange(1500).change(function()
{
    document.forms["form"].submit();
});
</script>

<?
//pokaż wynik post'a
echo "<pre>";
print_r($_POST);
echo "</pre>";
?>
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.