【问题标题】:Replacing an element and returning the new one in jQuery在 jQuery 中替换元素并返回新元素
【发布时间】:2010-10-27 22:19:59
【问题描述】:

如何在 jQuery 中替换元素并返回替换元素而不是被删除的元素?

我有以下情况。我有很多复选框,一旦您单击其中一个,该复选框就会被加载图标替换。一旦发生了一些 AJAX 问题,加载图标就会被一个勾号图标取代。

使用 jQuery 的 replaceWith,你会做这样的事情:

$("input[type='checkbox']").click(function() {

  $(this).replaceWith("<img src='loading.jpg' alt='loading'/>");
  $.post("somepage.php");
  $(this).replaceWith("<img src='tick.jpg' alt='done'/>"); 

});

但是,这不起作用,因为replaceWith 返回的是被删除的元素,而不是被添加的元素。所以在 AJAX 完成后,loading.jpg 将永远留在那里。

有没有什么方法可以在不选择的情况下返回替换元素?

提前致谢。

【问题讨论】:

    标签: jquery replace


    【解决方案1】:

    如果没有必要专门使用 replaceWith 方法 - 您可以使用与 replaceWith 相反的 replaceAll 方法。

    在这里查看答案:(answer to a similar question asked a year later) replaceAll 将作为参数传递的对象中的每个元素或与作为参数传递的选择器匹配的元素替换为匹配的元素,并返回匹配的元素(新内容)。

    这样,tvanfosson 回答中的编辑(以及 Keeper 回答中的代码)将如下所示:

    $("input[type='checkbox']").click(function() {
        var loading = $("<img src='loading.jpg' alt='loading' />").replaceAll($(this));
        $.post("somepage.php", function() {
            loading.replaceWith("<img src='tick.jpg' alt='done'/>");
        });
    });
    

    这只是缩短了一行,但为了简洁起见,并包括使用 replaceAll() 的选项,我认为适合将此答案添加到这个旧的和更多查看的问题。

    【讨论】:

      【解决方案2】:

      我编写了一个小插件来实现类似的结果,因为我希望能够在一行代码中检索新项目的指针。

      (function($){
          $.fn['overwrite'] = function(target){
              $(target).replaceWith(this);
              return this;
          }
      }(jQuery));
      

      使用示例:

      $("input[type='checkbox']").click(function() {
          var $loading = $("<img src='loading.jpg' alt='loading' class='loading-image' />").overwrite( this );
          $.post("somepage.php", function() {
              $loading.replaceWith("<img src='tick.jpg' alt='done'/>");
          });
      });
      

      【讨论】:

        【解决方案3】:

        检查这个。

        $.fn.replaceWithMod = function(obj) {
        var $a = $(obj);
        this.replaceWith($a);
        return $a;  
        };
        
        var newObj  = $('a').replaceWithMod('<div>New Created Object</div>');
        $(newObj).css('color','green');
        

        【讨论】:

          【解决方案4】:

          为什么不像这样制作一个中间 jquery 对象?...

          $("input[type='checkbox']").click(function() {
              var insertedElement = $("<img src='loading.jpg' alt='loading'/>");
              $(this).replaceWith(insertedElement);
              $.post("somepage.php");
              var anotherInsertedElement = $("<img src='tick.jpg' alt='done'/>");
              $(this).replaceWith(anotherInsertedElement);
              //do something with either of the inserted elements
          });
          

          【讨论】:

          • 另外,一旦调用replaceWith方法,对原始复选框$(this)的引用就会丢失,所以即使修复了语法错误,它也不起作用。
          • 另外,$.post 是异步的。
          • 好的 - 我纠正了错字。看了tvanfosson的帖子,又重读了原帖,我现在明白了原代码的意图,同意你的cmets。
          【解决方案5】:

          你可以使用索引给它一个唯一的ID:

          $("input[type='checkbox']").click(function() {
            var index = $("input[type='checkbox']").index(this);
            $(this).replaceWith("<img src='loading.jpg' id='myLoadingImage" + index + "' alt='loading'/>");
            $.post("somepage.php");
            $('#myLoadingImage'+index).replaceWith("<img src='tick.jpg' alt='done'/>"); 
          
          });
          

          【讨论】:

          • 对不起,我应该更清楚。我有很多这样的复选框,所以我不能依赖 id。
          • 我更新了代码。现在它使用复选框的索引获得一个唯一的 id。
          • 虽然比tvanfosson的快,但是还是比较浪费,看看Keeper的回答吧。
          【解决方案6】:

          给加载图片一个类,然后在 post 回调中,使用该类作为选择器来查找刚刚注入的图片。

          $("input[type='checkbox']").click(function() {
            $(this).replaceWith("<img src='loading.jpg' alt='loading' class='loading-image' />");
            $.post("somepage.php", function() {
                $('.loading-image').replaceWith("<img src='tick.jpg' alt='done'/>");
            });
          });
          

          如果您可能同时运行多个此类,则可以获取最近的 this 父级,并在搜索类时将其用作上下文。

          编辑:另一种替代方法,它使用变量来存储新元素,并且无需在函数返回时应用类和搜索新元素。

          $("input[type='checkbox']").click(function() {
            var loading = $("<img src='loading.jpg' alt='loading' />");
            $(this).replaceWith(loading);
            $.post("somepage.php", function() {
                loading.replaceWith("<img src='tick.jpg' alt='done'/>");
            });
          });
          

          【讨论】:

          • 不是使用 .loading-image 类,你不能只保留对加载 img 的引用并将其放在回调中,而是用 $('.loading-image 重新找到它')?
          • 问题(和答案)是特定于 replaceWith 的,它返回被删除的元素,而不是创建的元素。您可以创建元素并将对它的引用存储在变量中,然后进行替换。在这种情况下,我认为是的,您可以使用该参考,而无需再次查找。
          【解决方案7】:

          您的代码不起作用的原因是第一个 replaceWith 替换了 this 所指的项目。第二个 replaceWith 尝试再次替换它,但由于它已经消失了,所以没有什么可以替换的。并且勾号图标不会显示。

          最好的办法是使用 tvanfosson 建议的 post 回调函数。

          【讨论】:

            【解决方案8】:

            创建一个元素并将其用作replaceWith的参数:

            $('input[type=checkbox]').click(function() { var img = document.createElement('img'); img.src = 'loading.jpg'; $(this).replaceWith(img); $.post('somepage.php', function() { $(img).replaceWith('<img src="tick.jpg" alt="done"/>'); }); });

            【讨论】:

            • 我喜欢这个,没有其他类或 id 的混乱,你确切地知道要替换哪个 img。很干净。
            • +1 直到我用类似的代码更新了我的答案才看到这个。我仍然会使用 jQuery 来创建新元素。
            猜你喜欢
            • 2021-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-14
            • 2014-07-31
            • 2019-11-15
            相关资源
            最近更新 更多