如何为每组单词加亮一个单词?

时间:2019-12-02 11:32:13

标签: javascript

情况: 我有给学生的文字。文本中的三个位置分别位于不同的位置。始终,当三个单词出现在文本中时,必须通过单击将其中一个单词突出显示。

以下代码允许我这样做:

var words = $(document.getElementById("test1")).first().text().split(/\s+/);
var text = words.join("</span> <span>");
$(document.getElementById("test1")).html("<span>" + text + "</span>");
let highlighted;
$("span").on("click", function() {
  $(highlighted).css("background-color", "");
  $(this).css("background-color", "CornflowerBlue ");
  highlighted = this;

var wort = highlighted.innerHTML


  input1.value = wort;
});

编辑html:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div  style="font-size: 20px">
lots of text... <b><div id="test1" >[word1, word2, word3]</div></b> more text. <b><div id="test2" >[word1, word2, word3]</div></b>

问题: 第一组单词不是上面的代码有问题。对于第二组单词,我将使用ID为“ test2”的相同代码。当我单击第二组的单词时,第一组的标记也会消失。

问题: 如何在不删除先前ID的标记的情况下将代码用于多ID? (每组单词我都有一个标记)

2 个答案:

答案 0 :(得分:2)

我在VanillaJS中为您提供了此解决方案

"use strict";
console.clear();

// wrap in  IIFE
// @see https://en.wikipedia.org/wiki/Immediately_invoked_function_expression
void function(d,w) {
  // className of the divs to check
  const className = 'click-react';
  // className to give to highlighted spans
  const highlightClassName = 'click-highlight'
  
  // In every div ...
  Array.from(d.getElementsByClassName(className)).forEach(el => {
    // split text content by whitespace into words
    const words = el.innerText.split(/\s+/);
    // wrap each word with a span tag (with data attribute)
    const wordsMapped = words.map(i => `<span data-click>${i}</span>`)
    // overwrite div with those spans
    el.innerHTML = wordsMapped.join(' ');
  })
  
  // delegate click to document
  d.addEventListener('click', e => {
    // guard conditions:
    // only with correct data attribute
    if (!e.target.hasAttribute('data-click')) {return false}
    // only if inside div
    if (!e.target.closest(`.${className}`)) {return false}
    
    // get currently highlighted span in parent div of the clicked upon span
    Array.from(e.target.closest(`.${className}`).getElementsByClassName(highlightClassName))
      // remove the hightlighted class
      .forEach(el => el.classList.remove(highlightClassName))
      
    // highlight clicked upn span
    e.target.classList.add(highlightClassName)  
  })
  
}(document, window);
span.click-highlight {
  background-color: CornflowerBlue;
}

div {
  margin: 20px;
}
<div class="click-react">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Saepe doloremque provident fuga possimus eum, ratione libero sapiente, inventore blanditiis nobis est tempora totam? Neque sequi asperiores animi fugiat ducimus. Quidem?</div>

<div class="click-react">Lorem, ipsum dolor sit amet consectetur adipisicing elit. Error esse obcaecati alias temporibus placeat? Nesciunt aliquam fugiat perspiciatis doloremque voluptatum excepturi aliquid quam dolore qui quos? Natus dicta vero eius, a optio enim nisi, temporibus harum, non quo recusandae molestias?</div>
<div class="click-react">Tempora totam, dolorem unde consectetur maxime rem nesciunt perferendis soluta dolores earum blanditiis excepturi perspiciatis eaque magnam sint praesentium id dicta laborum quibusdam vel eligendi modi quod odio magni. Tempore aperiam eaque consequatur perspiciatis odit quasi doloribus facere nostrum nesciunt?</div>
<div class="click-react">Pariatur omnis consequuntur quae id, ducimus iste. Quos aliquid maiores totam quo animi voluptatem sed dolores fugit, minima, earum natus voluptas velit pariatur dolore voluptate. Mollitia a ratione facere quisquam voluptate, debitis at officia facilis exercitationem minima, similique magnam dolor.</div>
<div class="click-react">Nihil nulla facilis, odit, saepe tempore, voluptate nemo quod nam ullam corrupti magni! Veritatis soluta officiis rerum, distinctio iste dignissimos numquam. Quaerat deserunt voluptatum beatae accusamus perspiciatis, nemo non magni ut, assumenda similique quae? Similique maiores debitis quod id dolor.</div>

答案 1 :(得分:0)

您可以选择每个包含三个单词的div(在此示例中,我假设它们每个都有一个test-<NUMBER>类。选择之后,只需将一个类添加到突出显示的跨度中,然后根据当前div:

var words = $("class^=test-");
words.each(function() {
  const self = this;
  let innerWords = $(this).text().split(/\s+/);
  const text = innerWords.join("</span> <span>");
  $(this).html("<span>" + text + "</span>");
  $(this).find("span").on("click", function() {
    $(self).find(".highlighted").removeClass("highlighted");
    $(this).addClass("highlighted");
    const word = $(this).html();
    input1.value = word;
  })
})

添加CSS类:

.highlighted {
  background-color: CornflowerBlue;
}

jQuery的find()方法是这里的神奇之处。