2016-03-31 4 views
0

Ich habe ein kleines Problem, meine .toggleClass zu arbeiten. Ich bin sehr neu in Javascript, also vergib mir, wenn ich etwas wirklich einfaches hier vermisse. Ich möchte, dass Benutzer Lieblingsdinge wie Bilder und Posts nutzen können. Ich habe ein kleines Herz-Symbol, das beim Klicken rot/schwarz wird, je nachdem, ob sie hinzugefügt/entfernt werden. Alles funktioniert abgesehen von der .toggleClass. Kann jemand darauf hinweisen, wo ich falsch liege?toggleClass in Ajax Anfrage funktioniert nicht

index.php


<div class="heart-box"> 
    <?php 
//Check if user has fav'd the image.. 
    $hasFav = db::getInstance()->query("SELECT * FROM favourites WHERE userID = ? AND img_id = ?", array($the_user, $img_id)); 
    $action = $hasFav->results() ? 'unfav-heart' : 'fav-heart'; 
    ?> 

    <div class="<?php echo $action; ?> fa fa-heart" id="<?php echo $img_id; ?>" ></div> 
</div> 

Script


$(document).ready(function(){ 


    //add to favourites... 
    $('.fav-heart').click(function(){ 
    var img_id = $(this).attr('id'); 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     $(img_id).toggleClass("unfav-heart"); 
     } 
    }); 
    }); 
    // remove from favourites... 
    $('.unfav-heart').click(function(){ 
    var img_id = $(this).attr('id'); 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     $(img_id).toggleClass("fav-heart"); 
     } 
    }); 
    }); 
}); 

+0

Es ist eine schlechte Praxis, eine Abfrage in Front-End –

+0

Uh @ Matt.k, dass Abfrage mit PHP am Back-End, bevor die Seite gerendert wird ausgeführt wird. –

+0

@Jay ist es immer noch eine schlechte Idee, das zu sehen?! –

Antwort

2

JQuery ids braucht einen # in dem Selektor:

$(document).ready(function(){ 


    //add to favourites... 
    $('.fav-heart').click(function(){ 
    var img_id = $(this).attr('id'); 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     $("#"+img_id).toggleClass("unfav-heart"); 
     } 
    }); 
    }); 
    // remove from favourites... 
    $('.unfav-heart').click(function(){ 
    var img_id = $(this).attr('id'); 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     $("#"+img_id).toggleClass("fav-heart"); 
     } 
    }); 
    }); 
}); 
+0

Vielen Dank! Heilige Scheiße, ich bin seit Stunden wegen eines # festgefahren! Haha. Sehr geschätzt :) – ShiggyDooDah

+0

du bist weclome! –

+1

Warum die ID überhaupt verwenden? Sie haben eine Variable, die direkt auf das Element zeigt, verwenden Sie das. 'var img = $ (this)' in der click-Funktion und 'img.toggleClass()' in der success-Funktion. – Barmar

3

Wie in der anderen Antwort darauf hingewiesen, ausgelassen Sie den # Präfix eine ID in einem Selektor anzuzeigen. Es ist jedoch nicht notwendig, einen Selektor zu verwenden, da eine Variable direkt auf das Element zeigt.

$('.fav-heart').click(function(){ 
    var img = $(this); 
    var img_id = this.id; 
    $.ajax({ 
     url: 'favourites.php', 
     type: 'post', 
     async: false, 
     data:{ 
     'fav' : img_id 
     }, 
     success:function(){ 
     img.toggleClass("unfav-heart"); 
     } 
    }); 
    }); 
+0

Ich verwende kein Bildelement. Ich setze die ID für das Bild im id-Attribut und poste es dann in eine PHP-Datei. Diese PHP-Datei fragt dann die Datenbank zusammen mit der Benutzer-ID ab, um zu überprüfen, ob sie existiert oder nicht. Aber deine Antwort ist immer noch nützlich für mich, weil ich buchstäblich keine Erfahrung mit der Verwendung von Javascript habe, also sind solche Sachen immer praktisch zu wissen! Danke – ShiggyDooDah

+0

Sorry, ich habe nicht auf Ihren HTML-Code geschaut, ich nahm an, dass es ein Bild war, weil Sie die Variable 'img_id' aufgerufen haben. Aber der Typ des Elements ist irrelevant, der Punkt ist, dass Sie eine Variable haben, die das Element enthält. Es ist nicht notwendig, die ID zu verwenden, um sie im Callback zu finden. – Barmar

1

Ihre Click-Handler für beide Selektoren sind am Dokument bereit. Aus diesem Grund werden nur die Elemente, die den Selektorklassen entsprechen, dem Click-Handler zugewiesen. Wenn Sie die Klasse anschließend umschalten, müssen Sie die Click-Handler neu zuweisen.

Ein besserer Ansatz wäre, einen Click-Handler für alle Herzelemente zu registrieren. Innerhalb des Click-Handlers führen Sie eine Switch-Case-Anweisung aus, bei der Sie die Klasse entsprechend umschalten.

Verwandte Themen