0

我有一个嵌套列表,其中包含任意数量的 li 和任意数量的 li,其中每个 li 都有 2 个隐藏输入:一个 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 的?

4

2 回答 2

0

这是保存任意数量的 li 的 id 和父 id 的代码,该 li 包含任意数量的 ul,包含任意数量的 li 以及来自问题的相应 html。我承认这有点骇人听闻,但这是我想出的。希望它可以帮助某人。

        $('#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);

            });
        });
于 2013-01-11T15:14:45.010 回答
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 不会 == 未定义,它将是一个值,可能是“未定义”。

if(typeof($id) == "undefined")
于 2013-01-10T13:12:03.733 回答