【问题标题】:jQuery - move element and return to its exact previous location?jQuery - 移动元素并返回到它之前的确切位置?
【发布时间】:2012-05-22 10:23:15
【问题描述】:

我正在尝试使用 jQuery 将元素从 DOM 中的一个位置移动到另一个位置。旁边有与原始容器相同的元素,那么我如何存储它之前的确切位置以便它返回到它呢?这是一个例子......

<div class="container"></div>
<ul>
    <li></li>
    <li><div class="move">Content</div></li>
    <li></li>
    <li><div class="move">Content</div></li>
    <li></li>
</ul>

...“移动”div 分别移动到“容器”div,然后通过 jQuery .appendTo() 回到它们之前的位置。如何通过检测每个“移动” div 的移动位置(它在 DOM 中相对于文档或其他指定父容器的确切位置)来确保每个“移动”div 返回到其之前的确切位置?

编辑:我已经更正了 div 上的类,因为我正在处理的特定情况是列表项彼此完全相同(结构上),并且在它们各自的元素中具有独特的内容。此外,将“移动”div 移回其原始位置的事件是在其中单击的按钮。被移动的元素如何知道移动后要回到哪里(具体来说,它如何知道列表中的哪个列表项)?

【问题讨论】:

  • 如果您想要比已有答案更好的答案,您应该更新您的 HTML 以表示您所要求的内容。首先,如果您有“与它旁边的原始容器相同的元素”,那么您可以显示 2 个容器。如果您的文档“列表项彼此完全相同”,请删除它们的唯一类。
  • @FabrícioMatté 完成,感谢您的建议。
  • 我也会回答您的问题,但是使用此 HTML 很难准确说出您的期望。

标签: jquery dom-manipulation


【解决方案1】:

你可以clone他们,append他们,最后hide原始div,作为回报remove克隆的div和show原始。

【讨论】:

  • 与我输入的答案完全相同。认为这是最好的方法。
  • 看起来不错,但是如果 OP 必须遍历所有元素,例如要获取数据并发送到另一个页面,他必须使用.is(':visible') 添加支票。
  • @Fabrício Matté 我认为 div 的内容对于存储在 db 上没有用处。
  • @Raminson 如果 OP 试图用他的 divs/list 项重现 sortable 功能,或者他想出于任何原因使用排序的 divs/items,我只是做了一个说明将是重复的元素,需要额外检查。
  • 尽管您的答案适用于给定的问题,但我会尽快 +1(我没有投票权,直到 UTC 在大约 1 小时 30 分钟内重置:P)。
【解决方案2】:

在移动元素之前,将其.parent() 存储在一个变量中,然后在准备好时使用.append().appendTo() 将其返回。

【讨论】:

  • 简洁的答案,我不知道 .parent() 会存储您从中调用它的嵌套元素的相对索引。非常有用的信息,我也会尽快 +1。
  • 我创建了fiddle 来检查您的代码的功能,我相信您的代码将来会有用。
  • 这不起作用,因为根据操作的问题,“旁边有与原始容器相同的元素”。简单地存储父元素不会保留元素在 in 父元素中的位置。
  • @Madbreaks 是的,这是主要问题。我想知道,在 jQuery 或插件中是否有一个基本函数可以返回元素相对于文档的确切 DOM 位置?类似于 XPath,如在 Firebug 中,这是您评论的 XPath... /html/body/div[4]/div[2]/div/div[2]/div[2]/div[4]/table /tbody/tr[2]/td[2]/div/table/tbody/tr[3]/td[2]/div/span
  • HTML XML,为什么不用xpath呢? docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors
【解决方案3】:

以下是我所做的。您的帖子遗漏了一些重要的细节,所以我猜测一下,希望它们适用于您的情况。

我猜你在div.move 元素上有一个点击处理程序,将它们移动到container div 中。

CSS:

.placeholder { display:none; }

JS:

var id,
    gid = 0;

$('.move').click(function(e){
    if(!$(this).parents('.container')){
        // Move to container
        id = 'placeholder-' + gid++;
        $(this)
            .before('<div class="placeholder ' + id + '"></div>')  // Save a DOM "bookmark"
            .appendTo('.container')                               // Move the element to container
            .data('placeholder', id);                              // Store it's placeholder's info
    }
    else{
        // Move back out of container
        $(this)
            .appendTo('.placeholder.' + $(this).data('placeholder'))  // Move it back to it's proper location
            .unwrap()                               // Remove the placeholder
            .data('placeholder', undefined);        // Unset placeholder data
     }
 });

点击第一个div.move后,您的 HTML 将如下所示:

<div class="container">
    <div class="move>Content</div>
</div>
<ul>
    <li></li>
    <li><div class="placeholder placeholder-0"></div></li>
    <li></li>
    <li><div class="move">Content</div></li>
    <li></li>
</ul>

我有这个工作,虽然上面的代码未经测试。希望它传达了这个想法。我喜欢这种方法的地方:

  1. 没有重复元素(例如,这可能会破坏唯一 ID 要求)
  2. 对 DOM 的影响最小
  3. 已移动项目上的事件和处理程序保持不变,但不会重复

完美吗?不,但它工作得很好而且很干净。 YMMV。

干杯

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多