【问题标题】:How to retrieve parent container ID after sorting using Jquery sortable?使用Jquery sortable排序后如何检索父容器ID?
【发布时间】:2011-02-04 20:52:28
【问题描述】:

我有以下标记和 javascript 来对一些项目进行排序。项目可以在一个块内或跨其他块进行排序。它可以工作,但是在将项目从一个块移动到另一个块后,我在检索正确的块 ID 时遇到了问题。

例如,如果我在“Block 1”中移动项目 1,我会得到“I am in Block= block_1”,但如果我将项目 1 移动到 Block 2,我仍然会得到 I am in Block 1。

但我想将块 2 作为其父容器。我需要检索这个 id,以便我可以做一些 ajax 并相应地更新数据库。

你能帮我纠正一下吗?

<div id="blocks_sortable">
    <div id="block_1">
        <h2>Block 1</h2>

        <div class="items_sortable connectedSortable">
            <div id="item_1"> 
                <span>Item 1</span></div>   
            <div id="item_2"> 
                <span>Item 2</span></div>
            <div id="item_3"> 
                <span>Item 3</span></div>
        </div>
    </div>  
    <div id="block_2">
        <h2>Block 2</h2>

        <div class="items_sortable connectedSortable">
            <div id="item_4"> 
                <span>Item 4</span></div>   
            <div id="item_5"> 
                <span>Item 5</span></div>
            <div id="item_6"> 
                <span>Item 6</span></div>
        </div>
    </div>
</div>

<script>
$("#blocks_sortable").sortable({ });
$(".items_sortable").sortable({
     connectWith: '.connectedSortable'
    , forcePlaceholderSize: true
    ,         stop : function(event, ui){
                    alert("I am in block = "+$(this).parent().attr("id"));
                }
}).disableSelection();      
</script>

谢谢。

【问题讨论】:

  • 您应该注意的另一件事是,通常在从事件触发的函数中,事件是由“this”引用的......所以你要求的是父级事件对象不是被移动的元素。至少,我认为它是这样工作的......这就是它在 vanilla JS 中的工作方式(同样,我对 jQuery 并没有真正的经验,所以我不知道 $(this) 是否不同等)

标签: php javascript jquery jquery-ui-sortable


【解决方案1】:

也许它比使用 id 属性更好,而是使用它们的索引来标识元素。

更像

alert('I am in block' + $(this).parent().index());

【讨论】:

  • 不,它不起作用,或者我不知道如何正确使用它。我得到索引为 -1 等。
【解决方案2】:

您可以放心并添加一个 REL 属性,该属性将保存相应父 ID 的值。当您移动元素时,您需要添加一些代码来维护该 REL 属性。

【讨论】:

    【解决方案3】:

    我怀疑问题是您使用了错误的事件。基本上我认为正在发生的是停止事件触发得太快或针对错误的对象。

    我会阅读文档Here,看看是否有更合适的活动适合您尝试做的事情。

    我认为您想要的是“更新”或“停用”事件。

    如果您将一个项目从一个“块”移动到另一个“块”,这两个事件将针对每个“块”触发一次。

    如果在块内移动,更新只会触发一次

    Deactivate 将始终对所有块触发。

    通过更新,您可以通过检查 ui.sender 来检查事件是否在“非原始”块中触发:

            $(".items_sortable").sortable({
                connectWith: '.connectedSortable',
                forcePlaceholderSize: true,
                update: function(event, ui){
                    if(ui.sender){
                        alert(ui.item.attr("nodeName") + "  in block = " + 
                        $(this).parent().attr("id"));
                    }
                }
            }).disableSelection(); 
    

    仅当项目移动到另一个块时才会提醒父 ID。两个块都会触发该事件,但警报只会显示“非原始”块。

    如果您使用 AJAX 更新数据库中的信息,我怀疑您想要的是为两个块触发的事件:

    一次用于现在缺少元素的“原始”,一次用于现在获得元素的“新”。

    我不太熟悉你在做什么或 jQuery UI,所以我不能更具体。请记住,文档是您的朋友。

    希望这会有所帮助。

    【讨论】:

    • 感谢先生的回答。仅供参考,它类似于类别和产品的关系.. 表项有 Item_id、Block_id、Name、order 和 Blocks 是 Block_id、block_name、block_order。因此用户希望在块内或跨块订购项目并将这些更改保存在数据库中。因此,如果一个项目被移动,我需要所有项目(我可以使用 toArray 和当前块获得)。我将快速查看更新/停用,但会再次彻底检查并让您知道。谢谢。
    • 祝你好运。希望我能帮助一些人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 2012-05-15
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多