Ввод пуст после обновления текста в зеркальном отображении div

#javascript #dom

#javascript #dom

Вопрос:

Я пытаюсь создать очень простой редактор markdown. Я использую текстовую область слева для ввода данных, а справа у меня есть точка входа div, где я сохраняю все, что я вводил, когда я вводил это с помощью прослушивателя «keyup». Я получил текст для применения класса, чтобы сделать его жирным, когда код отформатирован с помощью * в начале и конце слова, но после обновления DOM с помощью этого следующее слово, которое я пытаюсь ввести, не добавляется и фактически отображается как пустое, когда я запускаю его через отладчик.

Вот JS, который у меня есть в настоящее время…

 const html = document.querySelector('#html-area');
const md = document.querySelector('#markdown-area');

html.addEventListener("keyup", function(e) {
    md.innerHTML = e.target.value;
    const words = md.innerHTML.split(' ');
    const len = words.length;

    for(let i = 0; i < len; i  ) {
        // if the first character is * and the last character is * and the length of the current word is greater than or equal to 2 then change that word by adding the ".bold" class to it. 
        if(words[i][0] === "*" amp;amp; words[i][words[i].length - 1] === "*" amp;amp; words[i].length >= 2){

            const indexOfWord = md.innerHTML.split(' ').indexOf(words[i]);

            const newWord = md.innerHTML.split(' ')[indexOfWord] = ` <span class="bold">${md.innerHTML.split(' ')[indexOfWord]}</span> `;

            const before = md.innerHTML.split(' ').slice(0, indexOfWord).join();

            md.innerHTML = before   newWord;

            break;
        }
    }
});
  

И вот мой HTML…

 <!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="./css/index.css" />
    <title>MarkDown</title>
  </head>
  <body>
    <!-- HTML -->
    <div id="app">
      <div id="html-container">
        <h2>HTML</h2>
        <section>
          <label for="html-area"></label>
          <textarea
            name="html-area"
            placeholder="type html here..."
            id="html-area"
          ></textarea>
        </section>
      </div>
      <!-- Markdown -->
      <section id="markdown-container">
        <h2>MarkDown</h2>
        <div>
          <div
            id="markdown-area"
          >Markdown text will show here...</div>
        </div>
      </section>
    </div>
    <script src="./index.js"></script>
  </body>
</html>
  

Спасибо за любые советы или помощь.

Ответ №1:

Одна вещь: здесь

             md.innerHTML = before   newWord;
  

вы сокращаете вывод с помощью нового слова. Вам нужно определить некоторые, after похожие на before , и md.innerHTML = before newWord after; .

Хотя лучшим решением было бы сделать: split — map — join. Разделите вводимый текст на слова, сопоставьте их с оригинальной или выделенной жирным шрифтом версией и соедините обратно. Что-то вроде этого:

 const html = document.querySelector("#html-area");
const md = document.querySelector("#markdown-area");

const bold = word =>
  `<span class="bold">${word.substring(1, word.length - 1)}</span>`;

const boldOrNot = word =>
  word.startsWith("*") amp;amp; word.endsWith("*") amp;amp; word.length > 2
    ? bold(word)
    : word;

html.addEventListener("keyup", function(e) {
  const input = e.target.value;
  const output = input.split(" ").map(boldOrNot).join(" ");
  md.innerHTML = output;
});
  

https://codepen.io/anon/pen/jRrxZx