jQuery .wrap()没有包装克隆元素

Sam*_*Sam 12 javascript jquery clone

(function($) {
  $.extend({
    notify: function(options, duration) {
      var defaults = {
        inline: true,
        href: '',
        html: ''
      };
      var options = $.extend(defaults, options);

      var body = $('body'),
        container = $('<ul></ul>').attr('id', 'notification_area'),
        wrapper = '<li class="notification"></li>',
        clone;

      if (!body.hasClass('notifications_active')) {
        body.append(container).addClass('notifications_active');
      }

      if (options.inline == true && options.href) {
        clone = $(options.href).clone().wrap(wrapper);
      }

      clone.css('visibility', 'hidden').appendTo(container);

      var clone_height = 0 - parseInt(clone.outerHeight());
      clone.css('marginBottom', clone_height);

      clone.animate({
        marginBottom: 0
      }, 'fast', function() {
        clone.hide().css('visibility', 'visible').fadeIn('fast');
      });
    }
  });
})(jQuery);

$(function() {
  $('a').click(function() {
    $.notify({
      inline: true,
      href: '#alert'
    }, 3000)
  })
})
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/sambenson/RmkEN/

在上面的例子中,我正在克隆一个元素并尝试用它包装,<li></li>但克隆根本没有被包装.

有什么想法吗?

Den*_*app 22

令人困惑的部分可能是你.wrap()返回内部元素,而不是父元素.

因此,您必须使用包装的对象,如下所示:

var $divA= $("<div/>").addClass('classA'),
    $divB= $("<div/>").addClass('classB');

console.log( $divA.wrap($divB).parent() );
Run Code Online (Sandbox Code Playgroud)

($divA.parent()等于$divB包装后)

所以关键部分是$divA.wrap($divB)返回$divA,不是$divB

看参考文献:

此方法返回用于链接目的的原始元素集.

请注意:元素不必在DOM中,jQuery可以在没有插入DOM的情况下对它们进行操作.


Int*_*ang 17

关键是.wrap()文档中的这一行:

此方法返回用于链接目的的原始元素集.

.wrap()仅对DOM中已有的元素进行操作.所以,你需要插入它,然后包装它.

  • 不,你不必.jQuery可以在任何DOM元素上运行,无论它们是否在DOM中都无关紧要.关键部分(和误导性部分)是.wrap返回内部元素,而不是包裹子元素的父元素.如果你想得到它,你必须编写.parent,如下面的控制台测试代码:$('<div class ="child"/>').wrap($('<div class ="parent"/> ")).亲本() (26认同)