使用jquery/javascript查找元素的当前第一个子元素?

使用jquery/javascript查找元素的当前第一个子元素?,javascript,jquery,Javascript,Jquery,我在过去从这个网站上得到了很好的结果(阅读:昨天),这里的一个贡献者创建了这个:。现在我想让当前选择的选项卡与第一个选项卡交换位置。我很难理解如何使用Jquery和Javascripts以及第一个子选择器。我将通过克隆第一个菜单项,将其放置在单击的菜单项之前,并用单击的菜单项替换第一个菜单项来交换菜单项。我想我可以使用jquery的this-child选择器来确定包装器的当前第一个子项。但是,如果元素的位置动态更改(由于replacewith),它是否也会动态更新第一个子元素。还是第一个子元素仍

我在过去从这个网站上得到了很好的结果(阅读:昨天),这里的一个贡献者创建了这个:。现在我想让当前选择的选项卡与第一个选项卡交换位置。我很难理解如何使用Jquery和Javascripts以及第一个子选择器。我将通过克隆第一个菜单项,将其放置在单击的菜单项之前,并用单击的菜单项替换第一个菜单项来交换菜单项。我想我可以使用jquery的this-child选择器来确定包装器的当前第一个子项。但是,如果元素的位置动态更改(由于replacewith),它是否也会动态更新第一个子元素。还是第一个子元素仍然是元素1

编辑: 谢谢大家的帮助。这就是我所使用的(是第一个真正按照我所希望的方式工作的元素):

(在jQuery中)
这将始终是当前选择的元素。如果您希望从您可能已选择的多个元素中选择第一个元素,只需在移动现有元素时执行
$('.elements')[0]
$('.elements:first child')
$('.elements:nth child(1)

即可,所以你不需要克隆任何元素

您可以使用
.sibles().first()
查找当前元素的第一个同级,并使用
.insertBefore
将该元素移动到当前元素的前面

然后可以使用
.prependTo()
将当前元素移动到列表中的第一个位置

function swapWithFirst(el) {
    var $el = $(el);
    $el.siblings().first().insertBefore(el);
    $el.prependTo(el.parentNode);
}
如果父节点中不包含文本节点,则中间行可以替换为:

$el.before(el.parentNode.firstChild);

如果要将所选选项卡移到第一位,请将此代码添加到
。单击()

编辑:如果要交换两个选项卡

var $firstTab = $('.menuitem:first');
var $clickedTab = $(this);

$firstTab.insertAfter($clickedTab);
$clickedTab.prependTo($clickedTab.parent());

试试看!代码可以自由编写。如果函数是在事件处理程序中调用的,我可以通过swapWithFirst(this)传递这个(创建事件的元素)吗?@user2472522是的,类似的东西应该是可能的。为什么这样不起作用?它将$parent声明为触发事件父元素的元素,检查触发元素是否为第一个元素,如果不是,则获取$parent的第一个子元素并将其设置在当前元素之前,然后将当前元素前置到parentn ode,使其成为第一个元素。我在哪里搞砸了?可能是因为我在对其他答案的评论中警告过你的那些空白节点。您还试图在原始HTML节点而不是jQuery对象上调用jQuery方法(例如,
.insertBefore
)。if似乎已损坏,即使单击的选项卡是当前选定的选项卡,它也会将其淡入淡出并再次显示。可能是因为空格节点。有没有一种简单的方法来确定第一个节点是否是空白节点,如果是,则移动到下一个同级节点?这不会交换第一个和单击的元素的位置。它会简单地将第一个元素变成第二个元素。它几乎可以工作。签出并单击第三个选项卡。它与第二个元素交换位置,但我看不出原因。如果在
prependto
中有输入错误,如果单击当前选定的元素,它应该是
prependto
,它将消失。因为如果应该是这样的
If(!$currenttab.is($firstmenu))
var $firstTab = $('.menuitem:first');
var $clickedTab = $(this);

$firstTab.insertAfter($clickedTab);
$clickedTab.prependTo($clickedTab.parent());