2009-11-03 6 views
0

Pouvez-vous vous me dire quelle serait la différence entre l'ID:jQuery/Ajax confusion variables

var id = $(this).attr("name"); 
    var id = 1; 

Le problème est que lorsque j'utilise le premier exemple de variable NE FONCTIONNE PAS

 $.ajax({ 
      type: "POST", 
      url: "http://localhost/", 
      data: dataString, 
      cache: false, 

      success: function(rating) { 
       $("span#rating-" + id).html(rating); 
      } 
     }); 

ET avec le second exemple cela fonctionne très bien.

OK, ce serait le code complet de la fonction:

$(function() { 

$(".vote").click(function() { 

    var id = $(this).attr("id"); 
    var name = $(this).attr("name"); 
    var dataString = 'id='+ id ; 
    var parent = $(this); 

    // var id = 1; 

    if (name=='up') { 

     $.ajax({ 
      type: "POST", 
      url: "vote.php?type=up", 
      data: dataString, 
      cache: false, 

      success: function(rating) { 
       $('span#rating-' + id).html(rating); 
      } 
     }); 
    } 
    else { 

     $.ajax({ 
      type: "POST", 
      url: "vote.php?type=down", 
      data: dataString, 
      cache: false, 

      success: function(rating) { 
       $('span#rating-' + id).html(rating); 
      } 
     }); 
    } 

    return false; 
}); 
}); 
+0

Où avez-vous ce code? Qu'est-ce que sous "this"? –

+0

Pouvez-vous nous montrer le html de l'élément qui a la classe "vote"? –

+0

Merci, je le découvre. – krasenslavov

Répondre

0

Si cela ne fonctionne pas, cela signifie la fonction ne fonctionne pas int le bon contexte et $ (this) ne fait pas ce que vous pensez que ce a un sens différent.


En effet, en regardant plus difficile le code, je ne vois pas comment cette pourrait être dans le cadre d'un élément DOM du tout. La fonction de rappel s'exécute probablement dans le contexte de l'objet JQuery ou quelque chose comme ça.

+0

Merci pour l'aide, vous avez raison, c'est la solution, c'est gentil un vilain mais ça marche pour l'instant. succès: fonction (résultat) { var sortie = result.split (",") $ ('span # rating-' + sortie [0]). Html (sortie [1]); } – krasenslavov

0

Je dirais que l'attribut nom de l'élément que vous vérifiez est pas 1, mais il est difficile de dire sans le balisage en question .

0

Besoin de plus d'informations mais l'explication évidente est que this n'est pas défini (ou n'est pas défini avec ce que vous pensez) au moment de l'initialisation id. Soit cela ou l'attribut name n'est pas ce que vous attendez.

0

Dans votre question, vous avez dit:

var id = $(this).attr("name"); 
var id = 1; 

Cependant, dans votre code complet que vous utilisez:

var id = $(this).attr("id"); 
var name = $(this).attr("name"); 

Le code complet de travail "devrait", comme vous n'avez pas votre identifiant et les attributs de nom mélangés.

Si cela ne fonctionne pas, il est probable que l'élément .vote que vous utilisez n'ait pas d'identifiant. De l'apparence du code, peut-être que vous désirez réellement l'id du parent .vote elements? Cependant, aucun moyen de le dire sans fournir de balisage supplémentaire.

Pour obtenir les éléments .vote ID parent serait:

var $vote = $(this); 
var $parent = $vote.parent(); 
var id = $parent.attr("id"); 
var name = $vote.attr("name"); 
var dataString = 'id='+ id ; 

Remarquez que je ne garde pas aussi à l'aide de $ (ce) et magasin plutôt l'objet retourné dans une variable. C'est beaucoup plus rapide car nous n'avons pas besoin de laisser jQuery retrouver l'élément. Une autre raison pour laquelle cela ne fonctionne pas est si vous voulez réellement l'id de vos boutons de vote. Ensuite, cela ne fonctionnerait pas simplement parce que les identifiants ne peuvent pas être dupliqués. Par exemple, vous devrez renommer l'identifiant entre les deux boutons de vote à quelque chose comme "vote-up-1" et "vote-down-1". Ou préférez simplement coller l'identifiant à l'intérieur de l'attribut "title" et l'utiliser pour l'identifiant de la publication plutôt que pour l'attribut id.

Espérons que ça aide.