Вставить HTML-тег для выделенного текста внутри тега абзаца

Я пытаюсь добавить новый элемент для выбранного элемента в тег абзаца. Фрагмент кода HTML, как показано ниже:

 <div class = "parent-bodytext">
     <p>Hello</p>
     <p>This one is</p>
     <p>Sample Text</p>
 </div>

Итак, в приведенном выше фрагменте я выбрал «одно» слово из второго тега P и, используя любое событие, я пытаюсь добавить элемент к этому выделенному тексту, чтобы результат был таким, как показано ниже:

 <div class = "parent-bodytext">
     <p>Hello</p>
     <p>This <strong>one</strong> is</p>
     <p>Sample Text</p>
 </div>

Итак, как можно добавить этот вновь созданный «сильный» элемент для выделенного выделенного текста?

Пожалуйста, объясните подробнее, когда вам нужно добавить сильный тег

Just code 09.01.2019 07:43

@Justcode, если я выберу любую кнопку, чтобы к выделенному тексту был добавлен сильный тег.

Avinash Jadhav 09.01.2019 07:47

Я не уверен на 100%, но я считаю, что невозможно добавить сильный тег с выделенным текстом, если вы хотите сделать это, вам нужно использовать какой-нибудь текстовый редактор, например ckeditor ckeditor.com, и использовать css, чтобы скрыть границу и т.д., чтобы он выглядел как исходная страница.

Yaseen Ahmad 09.01.2019 07:57

@YaseenAhmad Я пробую эту часть только в CKEditor. Вы знаете, как этого добиться с помощью CKEditor?

Avinash Jadhav 09.01.2019 08:06

@AvinashJadhav см. Эту ссылку jsfiddle.net/pq8yg5ke дайте мне знать, если вам понадобится дополнительная помощь.

Yaseen Ahmad 09.01.2019 08:30

@YaseenAhmad, это именно то, что я ищу. Не могли бы вы уточнить код javascript? Я там ничего не нашел.

Avinash Jadhav 09.01.2019 08:35

Я отвечаю на вопрос всем доступным кодом, но это поможет вам. удачи.

Yaseen Ahmad 09.01.2019 08:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
8
3 901
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обновлено: удалена зависимость jQuery. Вы можете добиться этого с помощью CSS. Во-первых, вам нужно разделить каждое слово пробелом. Затем добавьте класс strong в диапазоне, из которого возникло событие.

window.onload = function () {
  document.getElementsByClassName("parent-bodytext")[0].onclick = function(e) {
    var tgt = e.target;
    if (tgt && tgt.nodeName === 'SPAN') {
      tgt.classList.add('strong');
    }
  };
};
.strong{
  font-weight: bold;
}
<div class = "parent-bodytext">
     <p><span>Hello</span></p>
     <p><span>This</span> <span>one</span> <span>is</span></p>
     <p><span>Sample</span> <span>Text</span></p>
 </div>

Хороший ответ, но он хочет добавить сильного только с выделенным текстом, а не с полным текстом.

Yaseen Ahmad 09.01.2019 08:00

Возможно ли это без jquery? Использование базового API HTML, например element.innerHTML, document.getSelection (), getRangeAt (0).

Avinash Jadhav 09.01.2019 08:02

@AvinashJadhav удалить зависимость jQuery.

Ashish 09.01.2019 08:14

@YaseenAhmad немного изменил код, теперь класс strong добавляется только к выбранному слову, вы можете запустить фрагмент кода и попробовать.

Ashish 09.01.2019 08:15
Ответ принят как подходящий

Вы можете использовать window.getSelection для этой цели

const wrapper = document.getElementsByClassName('parent-bodytext')[0];

wrapper.addEventListener('mouseout', event => {
   const selection = window.getSelection();
   if (selection.rangeCount) {
       const replacement = document.createElement('strong');
       replacement.textContent = selection.toString();
       const range = selection.getRangeAt(0);
       range.deleteContents();
       range.insertNode(replacement);
   }
});
 <div class = "parent-bodytext">
 <p>Hello</p>
 <p>This one is</p>
 <p>Sample Text</p>
 </div>

Вы хотели что-то подобное?

window.onload = () => {
  function getSelectionParentElement() {
    var parentEl = null,
      sel;
    if (window.getSelection) {
      sel = window.getSelection();
      if (sel.rangeCount) {
        parentEl = sel.getRangeAt(0).commonAncestorContainer;
        if (parentEl.nodeType != 1) {
          parentEl = parentEl.parentNode;
        }
      }
    } else if ((sel = document.selection) && sel.type != "Control") {
      parentEl = sel.createRange().parentElement();
    }
    return parentEl;
  }

  function getSelectedText() {
    var text = "";
    if (typeof window.getSelection != "undefined") {
      text = window.getSelection().toString();
    } else if (
      typeof document.selection != "undefined" &&
      document.selection.type == "Text"
    ) {
      text = document.selection.createRange().text;
    }
    return text;
  }
  
  const makeBold = (selectStart, selectEnd, length, text)=>{
    let replacedText = `<strong>${text.substr(selectStart, length)}</strong>`;
    let textHalfA = text.substr(0, selectStart);
    let textHalfB = text.substr(selectEnd, text.length - 1);
    return textHalfA + replacedText + textHalfB;
  };
  
  function handleMouseUp() {
    // the selected text
    const text = getSelectedText();
    // the length of the selected content
    const selectedTextLength = text.length;
    // the parent of the selected content
    let parent = getSelectionParentElement();
    // the entire content of the parent
    let parentText = parent.innerHTML;
    // where the user's selection starts
    let selectStart = window.getSelection().getRangeAt(0).startOffset;
    // where the user's selection ends
    let selectEnd = window.getSelection().getRangeAt(0).endOffset;
    if (parent) {
      parent.innerHTML = makeBold(selectStart, selectEnd, selectedTextLength, parentText);
    }
  }

  document.onmouseup = handleMouseUp;
  document.onkeyup = handleMouseUp;
};
<p>I am a sentence.</p>

Источники будут это и это.

Также вот ручка :)


Edit: Code's updated. The modification of the selected content should be done correctly now. Although, I have no idea how to deal with a second modification to the already modified element.(I'll update again soon. Unless, OP has an idea ;))

когда я отвечаю, у меня такая же проблема, когда вы выбираете только «A» в тексте, он будет полужирным «A» везде в тексте.

Yaseen Ahmad 09.01.2019 08:04

Ах. Я пропустил это. Подожди секунду

C.RaysOfTheSun 09.01.2019 08:05

@YaseenAhmad исправил это :) Я постараюсь исправить проблему, о которой я упомянул после школы.

C.RaysOfTheSun 09.01.2019 09:20

Другие вопросы по теме