2012-06-28 5 views
3

Что бы я хотел сделать, так это: когда пользователь нажимает на отправку, я хочу, чтобы данные отображались в <tr/> (каждое поле было вложено в свой собственный <td/>).Динамически генерировать строку таблицы на успехе AJAX

Я уже написал сценарий, который на самом деле это делает, но система еще не динамична.

HTML:

<form name="contact" method="post" action=""> 
    <p> 
     <label for="name">Name</label> 
     <input type="text" name="name" id="name" /> 
    </p> 
    <p> 
     <label for="age">Age</label> 
     <input type="text" name="age" id="age" /> 
    </p> 
    <p> 
     <label for="mail">Mail</label> 
     <input type="text" name="mail" id="mail" /> 
    </p> 
    <p> 
     <input type="submit" name="submit" id="submit" value="Send" /> 
    </p> 
</form> 
<table id="results"></table> 

JS:

$(function() { 
    $("#submit").click(function() { 

     var name = $("input#name").val(); 
     var age = $("input#age").val(); 
     var mail = $("input#mail").val(); 

     var dataString = [name, age, mail]; 
     var n = dataString.length; 

     $.ajax({ 
      type: "POST", 
      url: "process.php", 
      data: dataString, 
      success: function() { 
       $('#results').append(
        $('<tr>') 
         .append($('<td>').append(dataString[0])) 
         .append($('<td>').append(dataString[1])) 
         .append($('<td>').append(dataString[2])) 
       ); 
      } 
     }); 
     return false; 
    }); 
}) 

Как вы можете видеть, я хватаю поля вручную с dataString[x], но как я могу сделать эту систему динамический?

Я думал об использовании цикла, как в следующем, но я не могу заставить его работать:

for(var i = 0; i < n; i++){ 
    row += "$('<td>').append("+dataString[i]+")"; 
} 

$('#results').append(
    $('<tr>') 
     .append(row) 
); 

любой намек о том, как это сделать? Или у вас есть более чистое решение?

+0

Когда вы на самом деле нажимаете кнопку отправки, форма отправляется, и страница обновляется. Вы можете изменить тип ввода на кнопку и использовать существующий JS-код. – Vimalnath

+0

@vimalnath Нет, нет; 'return false;' в конце функции, связанной с обработчиком события, предотвращает это. –

ответ

7

Эта строка кода:

row += "$('<td>').append("+dataString[i]+")"; 

не создает элемент и добавление в нее данных, это просто конкатенации row переменной и строкового литерала (который содержит JQuery код).

Почему бы не сделать row в фактический строку - а не строка, содержащая содержимое строки - то приобщать, что в обработчике success обратного вызова вместо:

var row = $('<tr>'); 
for(var i = 0; i < n; i++) { 
    row.append($('<td>').html(dataString[i])); 
} 

Тогда:

$('#results').append(row); 
+0

Я знал о проблеме, но не мог понять, как ее решить. Отлично, большое спасибо за это. – morgi

+0

Я думаю, что если я хочу иметь несколько форм (с различным количеством полей) на одной странице? Есть ли лучший способ реализовать этот скрипт, чем просто воспроизвести его с помощью разных «идентификаторов»? – morgi

0
var row = '<tr>'; 
var col = ''; 
for(var i=0;i<dataString.length;i++) 
    col += '<td>'+dataString[i]+'</td>'; 
row += '</tr>'; 
$('#results').append(row); 
0

Попробуйте это, это определенно сработает.

var str ='<tr>'; 
$.each(dataString, function(i){ 
    str += '<td>' + this + '<td>'; 
} 
$('#results').append(str + '</tr>'); 
Смежные вопросы