用jquery在一个句子中的两个单词下划线

Posted

技术标签:

【中文标题】用jquery在一个句子中的两个单词下划线【英文标题】:underline two word in a Sentence with jquery 【发布时间】:2021-10-24 09:32:44 【问题描述】:

这是我的代码,但只有一个字带下划线

$(document).ready(function() 
  let firstword = 'web';
  let secondword = 'js';

  $(".field.ConditionsAccept>.caption:contains('" + secondword + "'):contains('" + firstword + "')").each(function() 
    var regex = new RegExp("(" + secondword + ")", 'g');
    var regex2 = new RegExp("(" + firstword + ")", 'g');
    $(this).html($(this).text().replace(regex, '<span class="word" style="text-decoration: underline">$1</span>'));
    $(this).html($(this).text().replace(regex2, '<span class="word2" style="text-decoration: underline">$1</span>'));
  );
);
.ConditionsAccept  width: 500px; 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="field ConditionsAccept">
  <caption class="caption">Here is some web and js stuff</caption>
</table>

【问题讨论】:

请附上相关的html 欢迎来到 Stack Overflow!访问help center,使用tour 了解内容和How to Ask。如果您遇到困难,请发布您的尝试minimal reproducible example,并使用[&lt;&gt;] sn-p 编辑器记录输入和预期输出。 我来这里是为了一些好的 C# 标签,而我所能看到的只是修饰过的 javascript。失望是轻描淡写。 专业提示:正确标记您的问题,否则您只会被否决 我为你修好了 sn-p。下次请自行提供minimal reproducible example 开心的时候请访问how to accept an answer 【参考方案1】:

您的第二个 $(this).text() 已从内容中删除了第一个跨度

两次更改 HTML 也不是一个好主意。如果第一个单词是spanworddecoration,那么第一个跨度将被第二个更改破坏。

最安全的解决方案是在设置 HTML 之前替换所有文本。

$(document).ready(function() 
  let firstword = 'web';
  let secondword = 'js';

  $(".field.ConditionsAccept>.caption:contains('" + secondword + "'):contains('" + firstword + "')").each(function() 
    const regex  = new RegExp("(" + secondword + ")", 'g');
    const regex2 = new RegExp("(" + firstword +  ")", 'g');
    let text = $(this).text()
    console.log(text)
    text = text
      .replace(regex,  '<span class="word"  style="text-decoration: underline">$1</span>')
      .replace(regex2, '<span class="word2" style="text-decoration: underline">$1</span>');
    $(this).html(text)
      
  );
);
.ConditionsAccept  width: 500px; 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="field ConditionsAccept">
  <caption class="caption">Here is some web and js stuff</caption>
</table>

【讨论】:

【参考方案2】:

问题在于函数 text() 被用于获取元素的内容。这将获取文本,但 HTML 被剥离。因此,对于第一次使用,它会替换单词 js OK,但第二次使用会删除 span 元素,因此您只剩下第二次使用替换单词(即该正则表达式中的第一个单词)。

这个 sn-p 使用 html() 函数而不是 text() 来确保 span 保持不变。

<div class="field ConditionsAccept">
  <div class="caption">text0 js text web text1 js text3</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
  $(document).ready(function() 
    let firstword = 'web';
    let secondword = 'js';
    $(".field.ConditionsAccept>.caption:contains('" + secondword + "'):contains('" + firstword + "')").each(function() 
      var regex = new RegExp("(" + secondword + ")", 'g');
      var regex2 = new RegExp("(" + firstword + ")", 'g');
      $(this).html($(this).html().replace(regex, '<span class="word" style="text-decoration: underline">$1</span>'));
      $(this).html($(this).html().replace(regex2, '<span class="word2" style="text-decoration: underline">$1</span>'));
    );
  );
</script>

【讨论】:

更好的是在分配之前替换两者。就像我一样。如果替换中有“单词”,则在 span 内替换该类 可能会更好(取决于在这种情况下的定义),但我通常尽量不要在不必要的地方更改问题的代码。 在您的情况下,请尝试 let firstword = 'word';textdecoration【参考方案3】:

我使用您的代码制作了一个示例,并按照您所说的遇到了示例问题。我如何解决它是更改代码如下:

            $(this).html($(this).html().replace(regex, '<span class="word" style="text-decoration: underline">$1</span>'));
            $(this).html($(this).html().replace(regex2, '<span class="word2" style="text-decoration: underline">$1</span>'));

它对我有用。你可以试一试。

【讨论】:

以上是关于用jquery在一个句子中的两个单词下划线的主要内容,如果未能解决你的问题,请参考以下文章

替换字符串列表中的子字符串

命名习惯

JQuery中的id选择器含有特殊字符时,不能选中dom元素

前端规范一(命名规范)

找到匹配的单词并加下划线-但仅单词

c语言中像函数命名“void put_star(char ch,int n)”中的下划线是啥意思?