2011-12-16 6 views
1

мой первый пост здесь. Я не новичок в JQuery, но сложная кодировка довольно сложная (естественно!). Я объясню свою проблему как можно яснее. Я использую elgg, поэтому некоторый код здесь будет специфичным для elgg. Это не проблема.Получить атрибуты дочерних элементов элементов в .each() внутри другого .each()

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

echo "<div id='ques_holder'>"; 
echo "<table><tr><td style='width:380px;padding-right:10px;'>"; 
    echo "<b>Question:</b> "; 
    echo elgg_view("input/text", array('internalname' => 'ques_','internalid' => 'ques_')); 
echo "</td><td style='width:90px;'>"; 
    echo "<b>Answer:</b> "; 
    echo elgg_view("input/pulldown", array('internalname' => 'ans_','internalid' => 'ans_', 'options_values' => array('true' => 'True', 'false' => 'False'))); 
echo "</td></tr></table>"; 
echo "</div>"; 

Теперь я хочу, чтобы сделать возможным, чтобы добавить больше чем один вопрос в то время, так что я использую следующий код для клонирования для достижения этой цели:

var quescount = 0; 

function add_question() { 
quescount++; 
var clone = $("#ques_holder").clone(false); 
$("*", clone).add(clone).each(function() { 
    if (this.id) { 
     this.id = this.id + quescount; 
    } 
    if (this.name) { 
     this.name = this.name + quescount; 
    } 
}); 
$("#interact_input_questions_adder").append(clone); 
} 

Все это прекрасно работает. Добавляются новые вопросы, а их идентификаторы и имена обновляются с числом (quescount), а также с их дочерними элементами. Проблема связана со следующей частью. Я пытаюсь объединить все имена и значения ввода для отправки через ajax в php-файл. Здесь мой код разбивается. Я пытался выполнить двойной вызов .each() (один внутри другого), но что-то в моей кодировке не работает. Код ниже:

function save_questions(){ 
    var qrange = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 
    var activity = "<?php echo $activity;?>"; 
    datastr = "&activity=" + activity; 
    jQuery.each(qrange , function(index,value){ 
     $("#ques_holder"+value).find('input').each(function(){ 
      datastr += $(this).attr('name'); 
     }); 
    }); 
    alert(datastr); 
} 

вещей, чтобы рассмотреть
Типов входов поступающих может меняться каждый раз (один я дал только один пример)
кодирования Elgg не ломать вещи
qrange массив просто ограничить количество вопросов (которые я не положил в add_question() функции только пока)

Я предполагаю, что мне интересно, это ... вы можете сделать .each() внутри jQue ry.each(), и согласно моему кодированию, как я могу получить имена всех этих входов, найденных внутри этих вызовов?

Любая помощь очень ценится. Не стесняйтесь высмеивать меня за мое уродливое кодирование, я научил себя пробным ошибкам и ошибкам с таких сайтов, как stackoverflow. ;)

EDIT: после серьезного поцелуя лица я понял, что ошибка заключалась в том, чтобы не использовать «onclick», когда я должен быть. Окончательный материал выглядит следующим образом и фактически был предоставлен RightSaidFred, который почему-то удалил свой ответ.

function save_questions(){ 
    var qrange = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 
    var activity = "<?php echo $vars['activity'];?>"; 
    datastr = "&activity=" + activity; 
    jQuery.each(qrange , function(index,value){ 
     $("#ques_holder"+value).find('input').each(function(input_idx, input){ 
      datastr += "&" + $(input).attr('name') + "=" + $(input).attr('value'); 
     }); 
    }); 
    alert(datastr); 
} 
+0

И как ваш код нарушается? Каково содержание 'datastr'? Это важная деталь :). '.each()' inside '$ .each()' работает - см. [эта скрипка] (http://jsbin.com/osojil/edit#javascript.live). – kubetz

+1

Что означает «что-то в моей кодировке не работает»? Что вы хотите совершить и что на самом деле происходит? – gilly3

+0

** лицо ладонь ** - ужасная ошибка новобранец использования старого кода. Раньше у меня была кнопка «сохранить вопросы», заданные с идентификатором, но затем изменила jQuery на функцию, поэтому для нее был необходим onclick.Оповещения теперь появляются, как следует, с правильными данными. Следующий метод от ** maxijb ** также решает проблему, поэтому я буду отмечать ее как правильную и добавить свой окончательный код к вопросу. Извините за тупость, здесь слишком рано утром! – Allerion

ответ

0

Почему вы не поставить класс для всех дивы «ques_holder», например

<div id='ques_holder' class='holder'> 

Тогда вы просто должны сделать по одному, чтобы захватить все входы

$("div.holder input").each(function() { 
     var name = $(this).attr('name'); // if you need the name 
     var val = $(this).val(); // if you need the value 
     var parent = $(this).closest('div.holder').attr('id'); // if you need to know the parent number 
}); 
+0

спасибо, что я просто тестирую на данный момент. Я предупреждаю результаты, но предупреждение не отображается, поэтому я просто проверяю, есть ли что-то еще, что может случиться. Я отправлю обратно с дальнейшими результатами тестирования. – Allerion

+0

Этот метод работает хорошо в целом, хотя для моего конкретного случая это не так. Причина этого в том, что мой оригинальный блок div для клонирования скрыт и не должен быть включен в файл данных. (что-то я не упомянул) – Allerion

+0

Поместите уникальный id _ques_holder_ в скрытый блок, который должен быть включен. Назовите это следующим образом: $ («div.holder: not (#ques_holder) input»). Каждый (... – maxijb

Смежные вопросы