jQuery .wrap() 不环绕克隆元素

发布于 2024-12-21 07:37:42 字数 1586 浏览 2 评论 0原文

(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)
  })
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

http://jsfiddle.net/sambanson/RmkEN/

在上面的示例中,我克隆了一个元素并尝试用

  • 包装它,但克隆根本没有被包装。为什么?

    (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)
      })
    })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

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

    In the above example I'm cloning an element and attempting to wrap it with and <li></li> but the clone isn't being wrapped at all. Why?

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

    评论(2

    暖风昔人 2024-12-28 07:37:42

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

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

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

    $divA.parent() 等于 $divB 之后 请

    因此关键部分是 $divA.wrap($divB) 返回 $divA,而不是 $divB

    参阅参考:

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

    请注意:
    这些元素不必位于 DOM 中,jQuery 可以对它们进行操作,而无需将它们插入到 DOM 中。

    The confusing part is that .wrap() returns the inner element, not the parent element.

    So you have to use the parent object of the wrapped one as follows:

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

    ($divA.parent() is equal to $divB after the wrapping)

    So the key part is that $divA.wrap($divB) returns $divA, NOT $divB

    see the reference:

    This method returns the original set of elements for chaining
    purposes.

    Please note:
    The elements DON'T have to be in the DOM, jQuery can operate on them without them already having been inserted into the DOM.

    猫瑾少女 2024-12-28 07:37:42

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

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

    .wrap() 仅对 DOM 中已有的元素进行操作。因此,您需要将其插入,然后包裹起来。

    The key is this line in the .wrap() documentation:

    This method returns the original set of elements for chaining purposes.

    .wrap() only operates on an element already in the DOM. So, you will need to insert it, then wrap it.

    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文