Ajax – wywołanie funkcji po kliknięciu
Powiedzmy, że mamy funkcję, której wywołanie powoduje ukrycie zadanego wpisu (funkcja spełniająca takie zadanie jest podpięta w IPB pod guzik umieszczony pod każdym wpisem):
<div id="wpis10"><p>#10: przykładowy tekst</p></div>
<script type="text/javascript">
function ukryj_wpis( id ) {
$.ajax({
type: "POST",
url: "ukryj.php",
data: "id="+id,
success: function(msg){
// odpowiednie operacje
}
});
return false ;
}
</script>
Aby wywołać taką funkcję należy doczepić się do zdarzenia onclick. Można to zrobić dopisując onclick do obiektu. W przypadku linków trzeba będzie zadbać o zablokowanie przejścia pod wskazany adres. Innym sposobem jest podczepienie się przy pomocy jQuery do zdarzenia .click lub .live (to drugie zadba o prawidłowe działanie zdarzeń w przypadku, gdy na stronie będą dodawane nowe elementy).
Przykłady z użyciem onclick:
<a href="adres_dla_ludzi_bez_js" onclick="return ukryj_wpis( 10 )">ukryj wpis #10</a> <span onclick="ukryj_wpis( 10 )">ukryj wpis #10</span>
(return umieszczony przed ukryj_wpis odeśle wynik funkcji, czyli false, dzięki temu przeglądarka zrezygnuje z przejścia na adres_dla_ludzi_bez_js).
Przykłady z użyciem jQuery:
<div class="ukrywacz" rel="10"><p>ukryj wpis #10</p></div>
* .click
<script type="text/javascript">
$("div.ukrywacz").click( function() {
id = $(this).attr( 'rel' ) ;
ukryj_wpis( id ) ;
}) ;
</script>
* .live
<script type="text/javascript">
$("div.ukrywacz").live('click', function() {
id = $(this).attr( 'rel' ) ;
ukryj_wpis( id ) ;
});
</script>
Pozostaje jeszcze kwestia odpowiedniej reakcji na odebraną odpowiedź. Kod wywoływany w bloku success nie będzie widział wartości zmiennej id. Jednym ze sposobów na ominięcie tego problemu jest odesłanie przez php odpowiedniej informacji. Przykładowo:
<? // łączenie z bazą // sprawdzenie uprawnień itp. $id = $_POST['id'] ; // wykonanie zapytania do bazy zmieniającego widoczność wpisu, zapisanie wyniku do $result $wynik['id'] = $id ; $wynik['result'] = (int)$result ; echo json_encode( $wynik ) ; ?>
Funkcję ukryj_wpis zmieniamy na:
<script type="text/javascript">
function ukryj_wpis( id ) {
$.ajax({
type: "POST",
url: "ukryj.php",
data: "id="+id,
dataType: "json",
success: function(msg){
// odpowiednie operacje
// msg.id - id obiektu
// msg.result - wynik działania skryptu php
if( msg.result == 1 ) {
$("#wpis"+msg.id).hide() ;
}
}
});
return false ;
}
</script>
Warto tu dodać, że $(’a’).click()
nie będzie działać, jeśli struktura DOM nie została jeszcze stworzona.
Należy dać:
$(document).ready(function() {
$(’a’).click(function() { alert(’działa’); } );
return false;
});