2012-07-21 19 views
6

Quando si tenta di accedere alla classe '.box' del contenitore $, l'uso di (this) all'interno della chiamata ajax non funziona.Ajax (questo) non funziona

$container.on(
     "click", 
     ".box", 
     function(event){ 
      var description; 
      if($(this)[0].style.width == '70%'){ 
       $(this).find(".resultData").fadeOut('slow'); 
       $(this).css('width', '18%'); 
      }else{ 
       $.ajax({ 
        url:'scripts/php/fetchResultsData.php', 
        data: {action:value}, 
        type: 'post', 
        dataType: 'json', 
        success: function(data){ 
         description = data[0]; 
         $(this).css('width', '70%'); 
         $(this).append("\ 
          <div class='resultData'>\ 
           <div class='resultName'>" + $(this).find("p").html() + "</div>\ 
           <div class='resultDesc'>" + description +"</div>\ 
          </div>"); 
         /*alert($(this).find("p").html());*/ 
        } 
        }) 
      } 
      $container.masonry('reload'); 
     } 
    ); 

Nel caso in cui non si capisce bene quello che sto cercando di fare, sto cercando di cambiare il css di elementi dinamici. Ma per esempio,

$(this).css('width','70%');

non si sta adeguando il CSS a tutti. Se lo metto fuori dalla sezione ajax, success, funziona, ma poi non riesco a ottenere la 'descrizione'.

+0

Come regola generale, non tenta di utilizzare $ (questo), o per lo meno, usare una volta. Ma se ne hai bisogno più volte, memorizzalo come: var $ container = $ (this) e usa $ container. Questo aggiunge un po 'di efficienza, ma molto più chiarezza. Basta non usare $ questo, quello, io dappertutto, sconfigge lo scopo. – Azder

risposta

12

Sei vicino. 'questo' nel contesto in cui lo stai usando, fa riferimento alla richiesta Ajax piuttosto che alla cosa che ha emesso l'evento. Per risolvere questo problema, memorizzare una copia di questa prima di effettuare la richiesta AJAX:

    }else{ 
         var me = this; 
         $.ajax({ 
          ... 
          success: function(data){ 
           description = data[0]; 
           $(me).css('width', '70%'); 
+0

Sembra tutto così semplice ora che lo sto guardando! Grazie mille! – Adola

9

Basta aggiungere questo alla tua chiamata ... $.ajax

context: this, 

... e che funzionerà.


$.ajax({ 
    context: this, // <-- right here 
    url:'scripts/php/fetchResultsData.php', 
    data: {action:value}, 
    type: 'post', 
    dataType: 'json', 
    success: function(data) { // ...