【问题标题】:Update text in HTML element without deleting other elements (with jQuery only)更新 HTML 元素中的文本而不删除其他元素(仅限 jQuery)
【发布时间】:2018-11-14 23:39:13
【问题描述】:

怎么做? 我知道有解决方案,但我想知道 jQuery 是否提供了一个 jQuery only 解决方案,没有原生 Javascript 函数来执行以下操作。

什么? 假设我们有以下 HTML,并且我们想用“testDiv”类更改 div 的文本。我知道这是不好的 HTML,因为在另一个 HTML 标记中有一个 HTML 标记和纯文本。

setTimeout(function() {
  $('.testDiv')[0].childNodes[1].nodeValue = "1"
}, 500);
setTimeout(function() {
  $('.testDiv')[0].childNodes[1].data = '2'
}, 900);

setTimeout(function() {
  var $el = $('.testDiv'),
    $preStuff = $el.find('span').clone(true);
  $el.text('3').prepend($preStuff);

}, 1300);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="testDiv"><span>I like it </span> Hello World </div>

你有没有找到没有原生 Javascript 函数的方法?

这不能通过仅使用 jQuery 函数来完成,因为它是一个节点,我说得对吗? jQuery 没有内置函数吗?

【问题讨论】:

  • 不,jQuery 没有内置任何东西来做到这一点。
  • jQuery 是一个 JavaScript 库。这一切都在引擎盖下使用了本机 javascript。我不确定你在问什么。
  • 为什么不将文本包装在 span 中,给它“id”或“class”,然后在 vanilla/jquery 中做呢?
  • 为什么不$(".testDiv").html($(".testDiv span").clone().html() + " text");

标签: javascript jquery html


【解决方案1】:

jQuery 没有专门用于隔离文本节点的方法,但是一旦隔离,您可以将它们包装在 $() 中并使用 replaceWith()wrap() 之类的方法并将它们转换为标签元素并使用 text() 之类的方法进行替换

var $el =  $('.testDiv').contents().last().wrap('<span>').parent()

setTimeout(function() {
 $el.text('1')
}, 500);
setTimeout(function() {
  $el.text('2')
}, 900);

setTimeout(function() {      
  $el.text('3');
}, 1300);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="testDiv"><span>I like it </span> Hello World </div>

【讨论】:

    【解决方案2】:

    您可以使用first() 代替[0] 并使用contents() 获取所有子节点,包括文本节点。但是,我不知道执行 .data = &lt;new value&gt; 操作的 jQuery 方法,所以如果不存在,您可以使用 get() 来更改 textNode。

    setTimeout(function() {
      $('.testDiv').first().contents().get(1).data = "1";
    }, 500);
    setTimeout(function() {
      $('.testDiv').first().contents().get(1).data = "2";
    }, 900);
    
    setTimeout(function() {
      var $el = $('.testDiv'),
        $preStuff = $el.find('span').clone(true);
      $el.text('3').prepend($preStuff);
    
    }, 1300);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="testDiv"><span>I like it </span> Hello World </div>

    【讨论】:

      【解决方案3】:

      您可以使用以下代码更改该 div 中的 html:

      $('.testDiv').html('div 内的新文本');

      【讨论】:

      • 这如何定位文本节点并回答问题?
      • 问题是'你如何只用 jquery 改变 div 中的 html'。此 jquery 将更改所选 div 中的 html。这怎么不回答问题?
      • @merski007 我认为问题在于您的代码从 div 中删除了 html &lt;span&gt; 元素,这是 OP 不希望发生的。
      猜你喜欢
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多