【问题标题】:Trying to change individual letters of text when clicked on using JavaScript尝试使用 JavaScript 单击时更改单个文本字母
【发布时间】:2016-02-17 03:55:39
【问题描述】:

我最近在编码挑战中失败了,但我一直在努力完成它以获取未来的知识。当用户使用 JavaScript/jQuery 单击时,我正在尝试更改单个文本字母。在发生这种情况之前,必须采取一些步骤。除了步骤编号“3”之外,我已完成以下所有步骤。

路线:

1.) 将光标悬停在单词上方或下方会导致出现下划线。
2.) 当栏出现时单击一个单词会显示包含单词的新块。
3.) 通过单击每个字母来更改每个字母的颜色。在执行下一步之前,必须更改每个字母。
4.) 单击突出显示的单词会将单词突出显示为“橙色”。
5.) 再次单击突出显示的单词会将颜色更改为“红色” .
6.)再次单击突出显示的单词将重置该单词。

下面我在index.js 文件中实现了一些我认为逻辑上可行的伪代码,但不太确定如何一起配置它:

HTML:

    <div class="word_div">
      <p class="default_word_style"><span class="inner_default_word_style">It's</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">no</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">use</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">going</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">back</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">to</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">yesterday</span></p>,
      <p class="default_word_style"><span class="inner_default_word_style">because</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">I</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">was</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">a</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">different</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">person</span></p>
      <p class="default_word_style"><span class="inner_default_word_style">then</span></p>.
    </div>
  </div>
</div>

CSS:

.default_word_style {
  padding-bottom: 1em;
  display: inline;
}

.default_word_style:hover {
  text-decoration: underline;
  color: orange;
}

.inner_default_word_style {
  color: black;
}

.inner_default_word_style:hover {
 color: black;
}

.blue {
  color: blue;
  background-color: purple;
}

.bold_orange {
  color: orange;
}

.red {
  color: red;
}

.purple {
  color: purple;
}

.added_word {
  background-color: orange;
  color: white;
  width: 10%;
  text-align: center;
}

.display_none {
  display: none;
}

JavaScript

$(function(){
  counter = 0;
  var word = '';
  $('.inner_default_word_style').click(function(){
    counter += 1;
    if (counter == 1){
      word = $(event.target).html();
      $(event.target).append('<div class="added_word">' + word + '</div>');
      } else if (counter == 2){

        // 1.) When a letter is clicked, change its 'color' to 'purple'.

        // 2.) Check the string in which the letter is in to see if all the
        //     letters of that string have been clicked on.

        // 3.) IF all the letters in that string HAVE been clicked, 'counter += 1'
        //     so that the next click has a 'counter' = '3'.

        //     ELSE

        // 4.) IF all the letters have NOT been clicked on, 'counter -= 1'
        //     so that the next click has a 'counter' = '2' again. Repeat steps 1-3.


      } else if (counter == 3){
      $(".added_word").remove();
      $(event.target).addClass('bold_orange');
      }else if (counter == 4){
      $(event.target).addClass('red');
      } else if (counter == 5){
      $(event.target).removeClass('red bold_orange');
      counter = 0;
    }
    console.log(counter);
  });
});

另外,我是否需要在每个单独的字母周围放置标签以在点击时定位该字母?

【问题讨论】:

  • 你能把你的代码放在jsfiddle里吗?
  • 首先,每个单词需要一个计数器。
  • @HarshSanghani: jsfiddle.net/46vds67p/1
  • 点击字母和点击单词的交互不清楚。伪代码表示介绍中未说明的功能。
  • 我认为计数器是个坏主意。通过查看存在哪些类来检测单词的状态可能会更好。

标签: javascript jquery html css


【解决方案1】:

试试这个,其可能的优点是循环颜色变化定义在一个可以添加到的数组中。

var wordColors = ['black', 'bold_orange', 'red'];
var clss = { 'highlight':'purple' , 'dummy':'dummy' };

// Wrap all words in `<span class="word">....</span>`
var str = $('.word_div').text().split(/\s/).map(function(word) {
    return '<span class="word ' + wordColors[0] + '">' + word + '</span>';
});
$('.word_div').html(str.join(' '));

$('span.word').each(function(i, word) {
    // Wrap all letters in `<span class="letter">.</span>`
    var $word = $(word);
    var letters = $word.text().split('');
    str = letters.map(function(letter) {
        return '<span class="letter">' + letter + '</span>';
    });
    $word.html(str.join(''));
    str.length = 0;
}).on('click', function() {
    $word = $(this);
    $("#currentWord").text($word.text());
    var $letters = $word.find("span.letter");
    if($letters.not('.'+clss.highlight).not('.'+clss.dummy).length === 0) {
        $letters.off('click').removeClass(clss.highlight).addClass(clss.dummy);
        $.each(wordColors, function(i, color) {
            if($word.hasClass(color)) {
                var colorIndex = (i + 1) % wordColors.length;
                $word.removeClass(color).addClass(wordColors[colorIndex]);
                if(colorIndex === 0) {
                    $letters.removeClass(clss.dummy).on('click', letterClick); // reset
                }
                return false; // break
            }
        });
    }
});
function letterClick() {
    $(this).addClass(clss.highlight);
}
$('span.letter').on('click', letterClick);

https://jsfiddle.net/46vds67p/2/

尝试在wordColors 中添加“green”,以及相应的 CSS 指令。

【讨论】:

    【解决方案2】:

    这是我的出发点。我将单词拆分为 span,然后将它们与 click 事件绑定。

    目前这是第 1 步和第 3、4、5、6 步。

    我不明白第 2 步。

    $(function() {
      $('#tar > p').each(function(index, word) {
        word = $(word);
    
        var originalText = word.text();
        var newText = "";
    
        for (var i = 0; i < originalText.length; i++) {
          newText += '<span>' + originalText[i] + '</span>';
        }
    
        word.html(newText);
    
        word.hover(function() {
          word.addClass('underline');
        }, function() {
          word.removeClass('underline');
        });
    
        word.find('span').each(function(index, letter) {
          letter = $(letter);
    
          letter.click(function(e) {
            if (word.hasClass('wordstage2') || word.hasClass('wordstage1')) return;
            letter.addClass('colorText');
          });
        });
    
        word.click(function() {
          if (word.hasClass('wordstage2')) {
            word.removeClass('wordstage2');
          } else if (word.hasClass('wordstage1')) {
            word.removeClass('wordstage1');
            word.addClass('wordstage2');
          } else if (word.children().length == word.children(".colorText").length) {
            word.find('span').each(function(index, letter) {
              letter = $(letter);
              letter.removeClass('colorText');
            });
    
            word.addClass('wordstage1');
          }
    
        })
      });
    });
    .underline {
      text-decoration: underline;
    }
    .colorText {
      color: blue;
    }
    .wordstage1 {
      color: orange;
    }
    .wordstage2 {
      color: red;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    
    <div id="tar">
        <p>It's<p/> 
        <p>no<p/> 
        <p>use<p/> 
        <p>going<p/> 
        <p>back<p/> 
        <p>to<p/> 
        <p>yesterday<p/>, 
        <p>because<p/> 
        <p>I<p/> 
        <p>was<p/> 
        <p>a<p/> 
        <p>different<p/> 
        <p>person<p/> 
        <p>then<p/>. 
    </div>

    【讨论】:

    • 这不起作用。它使用首先需要考虑的逻辑为第 3 步提供了以下输出:“回到昨天是没有用的,因为那时我是另一个人。”
    • @Ctpelnar1988 恐怕我不明白你在说什么。 :S 关于你的评论,“它”是什么?
    • 我把它从 hello world 改成了你的原文,如果这就是你的意思:)?
    • 我很抱歉。这解决了这个问题。我最初将代码放在伪代码所在的区域。谢谢。
    • 啊,好吧,不用担心,哈哈,你让我有点困惑。很高兴我能帮上忙。
    【解决方案3】:

    为此,您需要每个单词一个计数器,而不是您可以实现这一点,我在您的代码中为此使用了 id。

    $(function(){
      counter = 0;
      var Elementcounter = {}; // to handle counter for each element
      var word = '';
      $('.inner_default_word_style').click(function(event){
       
          if(!isNaN(Elementcounter[event.target.id])){  
               Elementcounter[event.target.id] += 1;
         }else{
               Elementcounter[event.target.id] = 1;
         }
        counter =  Elementcounter[event.target.id]
    
        if (counter == 1){
          word = $(event.target).html();
          $(event.target).append('<div class="added_word">' + word + '</div>');
          } else if (counter == 2){
    
            // 1.) When a letter is clicked, change its 'color' to 'purple'.
    
            // 2.) Check the string in which the letter is in to see if all the
            //     letters of that string have been clicked on.
    
            // 3.) IF all the letters in that string HAVE been clicked, 'counter += 1'
            //     so that the next click has a 'counter' = '3'.
    
            //     ELSE
    
            // 4.) IF all the letters have NOT been clicked on, 'counter -= 1'
            //     so that the next click has a 'counter' = '2' again. Repeat steps 1-3.
    
    
          } else if (counter == 3){
          $(".added_word").remove();
          $(event.target).addClass('bold_orange');
          }else if (counter == 4){
          $(event.target).addClass('red');
          } else if (counter == 5){
          $(event.target).removeClass('red bold_orange purple');
          counter = 0;
        }
        console.log(counter);
      });
          });
    .default_word_style {
      padding-bottom: 1em;
      display: inline;
    }
    
    .default_word_style:hover {
      text-decoration: underline;
      color: orange;
    }
    
    .inner_default_word_style {
      color: black;
    }
    
    .inner_default_word_style:hover {
     color: black;
    }
    
    .blue {
      color: blue;
      background-color: purple;
    }
    
    .bold_orange {
      color: orange;
    }
    
    .red {
      color: red;
    }
    
    .purple {
      color: purple;
    }
    
    .added_word {
      background-color: orange;
      color: white;
      width: 10%;
      text-align: center;
    }
    
    .display_none {
      display: none;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
    <div class="word_div">
          <p class="default_word_style"><span class="inner_default_word_style" id="e1">It's</span></p>
          <p class="default_word_style"><span class="inner_default_word_style" id="e2" >no</span></p>
          <p class="default_word_style"><span class="inner_default_word_style"  id="e3" >use</span></p>
          <p class="default_word_style"><span class="inner_default_word_style"  id="e4" >going</span></p>
          <p class="default_word_style"><span class="inner_default_word_style"  id="e5" >back</span></p>
          <p class="default_word_style"><span class="inner_default_word_style"  id="e6" >to</span></p>
          <p class="default_word_style"><span class="inner_default_word_style"  id="e7" >yesterday</span></p>,
          <p class="default_word_style"><span class="inner_default_word_style"  id="e8" >because</span></p>
          <p class="default_word_style"><span class="inner_default_word_style"  id="e9">I</span></p>
          <p class="default_word_style"><span class="inner_default_word_style"  id="e10">was</span></p>
          <p class="default_word_style"><span class="inner_default_word_style"  id="e11" >a</span></p>
          <p class="default_word_style"><span class="inner_default_word_style" id="e12" >different</span></p>
          <p class="default_word_style"><span class="inner_default_word_style" id="e13" >person</span></p>
          <p class="default_word_style"><span class="inner_default_word_style" id="e14" >then</span></p>.
        </div>
      </div>
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多