Заменить часть строки множественного элемента классом с JS

Я изучаю JS, но все еще есть некоторые проблемы. Мне удалось отредактировать редактор WYSIWYG, чтобы пользователи могли нажимать кнопку «сноска», которая вставляет следующий HTML:

<span class = "footnote" data-toggle = "tooltip" title = "footnote">[FN]</span>

С помощью некоторого CSS я могу поместить число внутри элемента, которое будет считаться вверх:

body {
    counter-reset: footnotecounter;
}
span.footnote:before {
    counter-increment: footnotecounter;
    content: counter(footnotecounter);
    position: relative;
    top: -0.4em;
    visibility: visible;
}

span.footnote {
    color: #0389b9;
    font-size: 0.875rem;
}

И пример некоторого HTML:

Here is a text with a note.<span class = "footnote" data-toggle = "tooltip" title = "footnote">[FN]</span> And there will be a second one too!<span class = "footnote" data-toggle = "tooltip" title = "footnote">[FN]</span>

На самом деле я использую Popper и Twitter Bootstrap, чтобы показать содержимое «сноски» во всплывающей подсказке.

Теперь я пытаюсь удалить [FN] из всех элементов span, имеющих класс footnote, с помощью следующего javascript:

footnotes = document.getElementsByClassName('footnote');
for (var i = 0; i < length; i++){
  footnotes[i].replace("[FN]", " ");
}

Кажется, это не работает, но я не знаю, где моя ошибка. Кроме того, я думаю, что, поскольку я собираюсь использовать JS для изменения сносок, я мог бы вообще отказаться от CSS и использовать JS для создания увеличивающегося числа во всех элементах, верно?

Вот JSFiddle, чтобы показать живой пример.

Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны проверить свойство длина списка узлов сноски. Вы пытаетесь заменить сам элемент, а не текст внутри него. Вы должны заменить свойство textContent или внутренний текст элемента.

Попробуйте следующим образом:

var footnotes = document.getElementsByClassName('footnote');
for (var i = 0; i < footnotes.length; i++){
  footnotes[i].textContent = footnotes[i].textContent.replace("[FN]", " ");
}
body {
    counter-reset: footnotecounter;
}
span.footnote:before {
    counter-increment: footnotecounter;
    content: counter(footnotecounter);
    position: relative;
    top: -0.4em;
    visibility: visible;
}

span.footnote {
    color: #0389b9;
    font-size: 0.875rem;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>
Here is a text with a note.<span class = "footnote" data-toggle = "tooltip" title = "footnote">[FN]</span> And there will be a second one too!<span class = "footnote" data-toggle = "tooltip" title = "footnote">[FN]</span>
</p>

Обновление: Согласно обсуждению в комментариях

var footnotes = document.getElementsByClassName('footnote');
for (var i = 0; i < footnotes.length; i++){
  footnotes[i].innerHTML = footnotes[i].textContent.replace("[FN]", "<span class='new'>"+ (i+1) +"</span> ");
}
body {
  counter-reset: footnotecounter;
}

span.new{
  position: relative;
  top: -0.4em;
  visibility: visible;
}

span.footnote {
  color: #0389b9;
  font-size: 0.875rem;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>
Here is a text with a note.<span class = "footnote" data-toggle = "tooltip" title = "footnote">[FN]</span> And there will be a second one too!<span class = "footnote" data-toggle = "tooltip" title = "footnote">[FN]</span>
Here's the number 3 thanks to CSS: <span class = "footnote" data-toggle = "tooltip" title = "footnote">[FN]</span> and number 4 <span class = "footnote" data-toggle = "tooltip" title = "footnote">[FN]</span>. All of this thanks to the CSS counter
</p>

Чтобы избавиться от счетчика CSS, я изменил его на textContent.replace("[FN]", i+1). Кажется, это работает, но моя IDE (PHPStorm) говорит мне, что «типы аргументов не соответствуют параметрам». Скажите, это правильный способ?

Dirk J. Faber 10.03.2019 13:31

@DirkJ.Faber, что ты имеешь в виду под CSS-счетчик? Вы имеете в виду счетчик циклов for? Я считаю, что без какой-либо итерации вы не сможете этого сделать, поскольку текст, который вы хотите заменить, находится в отдельных элементах :)

Mamun 10.03.2019 14:15

Раньше я устанавливал число внутри элемента с помощью span.footnote:before и counter-reset: footnotecounter; в CSS, что создавало числа 1,2,3 и т. д. Учитывая, что теперь я все равно использую JS, я решил, что могу сделать это с помощью textContent.replace("[FN]", i+1), что работает. кажется... Затем я могу удалить весь CSS для создания видимых чисел. Имеет ли это смысл?

Dirk J. Faber 10.03.2019 14:22

@DirkJ.Faber, поскольку мне все еще не совсем ясно, не могли бы вы обновить созданную вами скрипку, чтобы я мог увидеть ее вживую и предложить?

Mamun 10.03.2019 14:36

Конечно, jsfiddle.net/dirkjf/khsg72qe/12. Вся нумерация выполняется с помощью CSS, а не JS. Но я также мог бы сделать footnotes[i].textContent = footnotes[i].textContent.replace("[FN]", i+1); и удалить весь CSS. Просто моя IDE выдает ошибку. Я получаю тот же результат, хотя.

Dirk J. Faber 10.03.2019 14:39

@DirkJ.Faber, код скрипки кажется мне правильным. Хотя я добавил другое решение, заменив текст элементом ОХВАТЫВАТЬ классом и написанным CSS в этом классе. Поскольку у вас возникли проблемы с IDE, вы можете попробовать это :)

Mamun 10.03.2019 14:59

Привет, это работает. Кажется, это проблема только IDE, но это избавляет от ошибки;)

Dirk J. Faber 10.03.2019 15:11

@DirkJ.Faber, это действительно здорово, удачного кодирования :)

Mamun 10.03.2019 15:14

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