.prependTo() 是不是遵循 jQuery 链接?

Posted

技术标签:

【中文标题】.prependTo() 是不是遵循 jQuery 链接?【英文标题】:Does .prependTo() follow the jQuery chaining?.prependTo() 是否遵循 jQuery 链接? 【发布时间】:2012-08-28 11:02:30 【问题描述】:

我正在制作一个项目,在某行中,有一个检查按钮,当被选中时,它会将其父级重新定位到底部。这是它的标记:

<div id="tasksWrapper">
    <div class="subTaskWrapper">
        <div class="subTask">
            <div class="subMarker"></div>
            <label class="subTaskLabel"></label>
            <div class="subHolder"></div>
            <div class="subOptions">
                <ul>
                    <li id="subInfo">Details</li>
                    <li id="subEdit">Edit</li>
                    <li id="subDelete">Delete</li>
                </ul>
            </div>
            <div class="checkButton"></div>
            <div class="optTrigger"></div>
        </div>
        // more than one of that subTask divs ...
    </div>
</div>

这是它的代码:

$("#tasksWrapper").on("click", ".subTask .checkButton", function()
    if($(this).parent().data("checked") == true)
        $(this).css("opacity", "0.2")
            .siblings(".optTrigger , .subHolder").show()
            .parent().data("checked",false);
     else 
        $(this).css("opacity", "1.0")
            .siblings(".optTrigger , .subHolder").hide()
            .parent().data("checked",true).appendTo($(this).parent().parent());
    

);

我希望将.subTask div 附加到.subTaskWrapper div,所以在else 的情况下,我首先尝试了这个:

else 
        $(this).css("opacity", "1.0")
            .siblings(".optTrigger , .subHolder").hide()
            .parent().data("checked",true).appendTo($(this).parent());
    

我认为.appendTo 在这种情况下会将.subTask div 附加到.subTaskWrapper div,但我收到了这个错误:

未捕获的错误:HIERARCHY_REQUEST_ERR:DOM 异常 3

但是当我在 .appendTo($(this).parent()) 添加另一个 .parent() 时,它起作用了,所以它变成了

.appendTo($(this).parent().parent())

我想知道为什么在第一种情况下会生成此异常以及.appendTo 位于.parent() 之后时如何受到影响,它是附加.parent() 还是仅附加原始$(this)

【问题讨论】:

您说您的代码正在使用parent().parent()。不要修复没有损坏的东西:)。要向自己确认为什么它会以这种方式工作,请尝试在浏览器中使用调试工具,例如console.log($(this))console.log($(this).parent())console.log($(this).parent().data("checked", true)) 等。此外,您还在询问Does .prependTo() follow the jQuery chaining?,但您的所有代码都与appendTo() 相关,这令人困惑。 我尝试使用console.log(),但我想放置它而不是.appendTo() 以了解当前$(this) 是什么,但我认为我不能在jQuery 中这样做,任何帮助.console.log()appendTo() 的位置将不胜感激。 在您的else 中,只需为您“链接”的每个元素放置控制台日志并观察控制台。例如,将控制台登录到您的 else 语句中:$(this)$(this).css("opacity", "1.0")$(this).css("opacity", "1.0").siblings(".optTrigger , .subHolder")$(this).css("opacity", "1.0").siblings(".optTrigger , .subHolder").hide().parent()$(this).css("opacity", "1.0").siblings(".optTrigger , .subHolder").hide().parent().data("checked",true) 和当然$(this).parent()$(this).parent().parent() 【参考方案1】:

看起来您正在向自身附加一个元素;这将解释 DOM 层次结构错误。如果把链条的核心部分剥离出来,效果是:

$(this).parent().appendTo($(this).parent());

换句话说:

$(this).css("opacity", "1.0")                 // $(this) refers to checkButton
    .siblings(".optTrigger , .subHolder")     // context is still checkButton
    .hide()
    .parent()                                 // context is now subTask
    .data("checked",true)                     // still subTask
    .appendTo($(this).parent());              // $(this).parent() is subTask
                               // so, this line says to append subTask to itself

【讨论】:

啊,所以$(this).parent() 里面的.appendTo() 指的是.subTask 而不是.subTaskWrapper?那么.appendTo() 不遵循 jQuery 链接?因为我认为$(this)里面的.appendTo()指的是.subTask @Rafael 不,我认为这是正常的链接行为——链接只是意味着每个方法调用都返回相同的源对象。 @Rafael:我认为您的所有问题都可以通过 console.log 输出来回答,而不是第二次猜测哪个元素在哪里。请参阅我对原始问题的评论。 @Rafael this 与链接或 JQuery 无关。 this 上下文永远不会像那样改变。

以上是关于.prependTo() 是不是遵循 jQuery 链接?的主要内容,如果未能解决你的问题,请参考以下文章

[ jquery 文档处理 prependTo(content) ] 此方法用于把所有匹配的元素前置到另一个指定的元素元素集合中

jQuery 文档操作之prepend() 和prependTo()方法.

Jquery - 如何使用每个 appendTo 或 prependTo(关闭)

jQuery 选择元素的父元素并为其使用 prependTo()

jQuery prependTo( ) 方法

jquery之insertBefore(),insertAfter(),prependTo(),appendTo()用法详解