如何在嵌套的子列表中通过javascript保存父ID

时间:2013-01-10 13:07:03

标签: php jquery

我有一个嵌套列表,里面有任意数量的li和li里面的任意数量的ul,其中每个li都有2个隐藏的输入:id和父ID的id。

<ul>
    <li>
        <input type="hidden" name="question[id][]" value="'. $sub['id'] .'" />
        <input type="hidden" name="question[parent][]" value="'. $question['id'] .'" />
        <ul>
            <li>
            <input type="hidden" name="question[id][]" value="'. $sub['id'] .'" />
            <input type="hidden" name="question[parent][]" value="'. $question['id'] .'" />
            </li>
        </ul>
    </li>
    <li>
        <input type="hidden" name="question[id][]" value="'. $sub['id'] .'" />
        <input type="hidden" name="question[parent][]" value="'. $question['id'] .'" />
        <ul>
            <li>
            <input type="hidden" name="question[id][]" value="'. $sub['id'] .'" />
            <input type="hidden" name="question[parent][]" value="'. $question['id'] .'" />
            </li>
        </ul>
        <ul>
            <li>
            <input type="hidden" name="question[id][]" value="'. $sub['id'] .'" />
            <input type="hidden" name="question[parent][]" value="'. $question['id'] .'" />
            </li>
        </ul>
    </li>

</ul>

我正在使用jQuery sortable来对嵌套列表进行排序,现在在对它们进行排序之后,我需要将相应的父ID保存到子列表中的每个项目。

理论上,每个子问题的父ID是第二个最接近的ul的第一个输入的值。 此外,如果没有父ul,那么我想将父ID设置为0。 我怎么找到它?这就是我到目前为止所做的:

$('#reorder_form').submit(function(){
    $('li').each(function() {
        $id = $(this).closest('ul').closest('li').find("input[name='question[id]']").val();
        if(typeof($id) == 'undefined') $id=0;
        $(this).find("input[name='question[parent]']").val($id);
    });
});

我不是100%确定这是你如何正确循环每个输入因为我每次击中两次。也许我应该循环使用li?

2 个答案:

答案 0 :(得分:0)

你想要升到最近的li,然后再回到最近的li,然后回到输入。要真正语义化:

$id = $(this).closest('li').closest('li').find('input[name^="question[id]"]').first().val();

未选中。我会在jsfiddle中这样做,但它似乎已被打破。

$('li input[name^="question[parent]"]').each(function() {
  var $id = $(this).closest('li').closest('li').find('input[name^="question[id]"]').val();
  if(typeof($id)=="undefined") $id=0; 
  $(this).val($id);
});

如果.save指向表单中的按钮,只需注意一个注意事项(通常)有多种方式提交表单。 $('#theform').on('submit', function(){...});是最好的方法。

另外

if(typeof($id) == undefined) 

我很确定总会返回false,因为typeof不会== undefined,它将是一个值,可能是'undefined'。

if(typeof($id) == "undefined")

答案 1 :(得分:0)

这是保存任意数量的li的id和父ID的代码,其中包含任意数量的ul,其中包含来自问题的相应html的任意数量的li。我承认它有点hackish,但这是我想出来的。希望它可以帮到某人。

        $('#reorder_form').submit(function(){
            $('li input[name^="question[parent]"]').each(function() {
                $ul = $(this).closest('ul').parent().closest('ul');
                $attr = $ul.attr("class");
                if(typeof($attr) == 'undefined')
                    $id=0;
                else
                    $id = $ul.find("li input[name^='question[id]']").val();
                $(this).val($id);

            });
        });