2010-04-01 5 views
1

Chose drôle est que si je supprime le commentaire pour alerte (données [i] .id) le code fonctionne. Comme dans l'exemple, la chaîne n'est pas concaténée, donc je n'ai pas d'options dans la boîte de sélection. Astuces? Aidez-moi?comportement drôle de code jquery

Réédition de sorte que les gars vous pouvez voir toute la méthode

function socialbookmarksTableData(data) 
{ 
    var toAppend = ''; 
    var bookmarkingSites = ''; 

    $.getJSON("php/socialbookmark-get-bookmarking-sites.php",function(data){ 

     for(var i = 0; i < data.length; i++){ 
      //alert(data[i].id); 
      bookmarkingSites += '<option value = "' + data[i].id + '">' + data[i].title + '</option>'; 
     } 
    }); 

    $.each(data.results, function(i, id){ 

     if(i%2 == 1) 
      toAppend += '<tr class="first">'; 
     else 
      toAppend += '<tr class="second">'; 
     if(data.results[i].status == "PENDING" || data.results[i].status == "POSTED") 
      toAppend += '<td><span class="approved">' + data.results[i].status + '</span></td>'; 
     else 
      toAppend += '<td>' + data.results[i].status + '</td>'; 
     toAppend += '<td><select name="sb2" id="sb2">'+ 
     '<option value="'+ data.results[i].bookmark +'">' + data.results[i].bookmark +'</option>' + 
     bookmarkingSites + '</select></td>'; 
     toAppend += '<td>' + data.results[i].user + '</td>'; 
     toAppend += '<td>' + data.results[i].link + '</td>'; 
     toAppend += '<td>Some Article</td>'; 
     toAppend += '<td>' + data.results[i].title + '</td>'; 
     toAppend += '<td>' + data.results[i].description + '</td>'; 
     toAppend += '<td>' + data.results[i].tags + '</td>'; 
     toAppend += '<td>' + data.results[i].date + '</td>'; 
     toAppend += '<td><div class="actions">'; 
     toAppend += '<ul><li><input class="radio" name="input" type="checkbox" value="' + data.results[i].id + '" /></li>'; 
     toAppend += '<li><a class="action1" href="#">1</a></li>'; 
     toAppend += '<li><a class="action4" href="#">4</a></li></ul></div></td></tr>'; 
    }); 
    $("#searchTable tbody").append(toAppend); 
} 

Répondre

2

est une raison: Lorsque vous placez des chaînes entre guillemets simples, vous ne devez pas échapper aux guillemets doubles (la barre oblique inverse ne fonctionne pas comme évasion ici de toute façon j'opère pense). Donc ceci:

bookmarkingSites += '<option value = \"' + data[i].id + '\">' + data[i].title + '</option>'; 

devrait être:

bookmarkingSites += '<option value="' + data[i].id + '">' + data[i].title + '</option>'; 

L'autre raison: votre code entre <some more code> n'est pas dans la fonction de rappel, mais vous essayez o les données d'accès de la fonction (data et bookmarkingSites). Placez tout le code de génération HTML dans la fonction de rappel.


Ah il est une autre donnée;) Quoi qu'il en soit, vous ne pouvez pas accéder bookmarkingSites dans votre code, car il n'existe pas encore lorsque le code est exécuté. Essayez ceci:

function socialbookmarksTableData(data) 
{ 

    $.getJSON("php/socialbookmark-get-bookmarking-sites.php",function(bookmarks){ 

     var toAppend = ''; 
     var bookmarkingSites = ''; 

     for(var i = 0; i < bookmarks.length; i++){ 
      //alert(bookmarks[i].id); 
      bookmarkingSites += '<option value = "' + bookmarks[i].id + '">' + bookmarks[i].title + '</option>'; 
     } 

     $.each(data.results, function(i, id){ 

      if(i%2 == 1) 
       toAppend += '<tr class="first">'; 
      else 
       toAppend += '<tr class="second">'; 
      if(data.results[i].status == "PENDING" || data.results[i].status == "POSTED") 
       toAppend += '<td><span class="approved">' + data.results[i].status + '</span></td>'; 
      else 
       toAppend += '<td>' + data.results[i].status + '</td>'; 
      toAppend += '<td><select name="sb2" id="sb2">'+ 
      '<option value="'+ data.results[i].bookmark +'">' + data.results[i].bookmark +'</option>' + 
      bookmarkingSites + '</select></td>'; 
      toAppend += '<td>' + data.results[i].user + '</td>'; 
      toAppend += '<td>' + data.results[i].link + '</td>'; 
      toAppend += '<td>Some Article</td>'; 
      toAppend += '<td>' + data.results[i].title + '</td>'; 
      toAppend += '<td>' + data.results[i].description + '</td>'; 
      toAppend += '<td>' + data.results[i].tags + '</td>'; 
      toAppend += '<td>' + data.results[i].date + '</td>'; 
      toAppend += '<td><div class="actions">'; 
      toAppend += '<ul><li><input class="radio" name="input" type="checkbox" value="' + data.results[i].id + '" /></li>'; 
      toAppend += '<li><a class="action1" href="#">1</a></li>'; 
      toAppend += '<li><a class="action4" href="#">4</a></li></ul></div></td></tr>'; 
     }); 
     $("#searchTable tbody").append(toAppend); 
    }); 
} 
+0

merci, fonctionne comme un charme maintenant. – user253530

+0

En plus des guillemets environnants, vous avez besoin de l'échappement HTML partout où vous mettez du texte dans une chaîne de HTML. Le code tel qu'il est standard est rempli de trous de sécurité XSS (cross-site-scripting) potentiels pour cette raison. Il est souvent plus facile d'écrire le contenu des '' et des attributs en utilisant appelé comme 'text()' et 'attr()'/'val()' plutôt que de construire des chaînes HTML modélisées. – bobince

0

Qu'est-ce que vous avez est une condition de course classique. Le code getJSON effectue un appel asynchrone. Lorsque vous avez l'alerte là-bas le code sous l'appel getJSON est exécuté avant que l'appel ne revienne du rappel. Sans l'alerte, elle est exécutée après le rappel. C'est en fait une chance car on ne peut pas garantir que cela se produira de cette façon. Vous devez placer tout le code qui repose sur les données renvoyées par l'appel getJSON dans le rappel afin que vous puissiez garantir que les données sont renvoyées avant de l'utiliser.

var bookmarkingSites = ''; 

$.getJSON("php/socialbookmark-get-bookmarking-sites.php",function(data){ 

    for(var i = 0; i < data.length; i++){ 
     //alert(data[i].id); 
     bookmarkingSites += '<option value = "' 
          + data[i].id + '">' 
          + data[i].title + '</option>'; 
    } 
    <some more code> 
    toAppend += '<td><select name="sb2" id="sb2">' 
       + '<option value="'+ data.results[i].bookmark +'">' 
       + data.results[i].bookmark +'</option>' 
       + bookmarkingSites + '</select></td>'; 
    <some more code> 
}); // end of JSON call/callback 
0

À partir du code fourni il semble que vous faites l'appel et la fonction de rappel JSON à la variable ajoute bookmarkingSites. jusqu'ici tout va bien. Le code vers lequel pointe la flèche est en dehors de la fonction de rappel et s'exécutera avant que le rappel JSON ne soit appelé. Par conséquent, bookmarkingSite sera une chaîne vide et il n'y aura pas d'options dans la zone de sélection.

Le code permettant de construire la balise d'option ne serait-il pas aussi dans le rappel ou dans une fonction appelée par le rappel?