【问题标题】:underline two word in a Sentence with jquery用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>

【问题讨论】:

标签: javascript jquery css regex


【解决方案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>'));
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多