显而易见的答案是:
$r = $p.wrap($f).parent();
顺便说一句,您正在做一个错误的假设: ap
不能包含另一个p
元素。曾经。DOM 构建完成后,会将内部p
元素移出预期的“父”元素。
如果您正在构建任意深度的东西,并且想要识别最顶层的元素,那么您当然可以使用:
$r = $p.wrap($f).parents().last();
虽然这假设被包装的元素此时不存在于 DOM 中,但如果它们存在,那么您可以使用选择器parents()
来限制潜在结果:
$r = $p.wrap($f).parents('parentClassName').last();
当然,您总是可以编写一个简单的 jQuery 插件,例如:
(function ($) {
$.fn.altWrap = function (node) {
var topmost = node[0];
this.wrap(node);
return topmost;
};
})(jQuery);
这允许以下(似乎)在我认为您所处的限制下工作:
$p = $('<em>sdf</em>');
$f = $('<div><div><span><p></p></span></div></div>');
$r = $p.altWrap($f);
console.log($p,$f,$r);
JS 小提琴演示。
通过一些(必要的)完整性检查更新了插件解决方案:
(function ($) {
$.fn.altWrap = function (node) {
var topmost, _tmp;
if (node && node.length) {
_tmp = node[0];
while (_tmp.firstChild && _tmp.firstChild.nodeType == 1) {
_tmp = _tmp.firstChild;
}
$(_tmp).append(this);
topmost = node[0];
}
else {
topmost = this;
}
return topmost;
};
})(jQuery);
$p = $('<em>sdf</em>');
$p2 = $('<em>some text</em>');
$f = $('<div><div><span><p></p></span></div></div>');
console.log($p2.altWrap($f));
JS 小提琴演示。
参考: