Диапазон внутри тега p с textContent и style.color не работает

У меня проблема с Javascript и HTML, и я пока не нашел решения.

Код здесь:

const valide = document.querySelector("#valider");
valide.addEventListener("click", valider);

function valider() {;
    let showEmotion = document.getElementById("test").value;

    if (showEmotion === "happy") {
        document.getElementById("show").textContent = "I'm";
        document.getElementById("mood").textContent = "happy";
        document.getElementById("mood").style.color = "blue"
    }
    else if (showEmotion === "sad"){
        document.getElementById("show").textContent = "I'm";
        document.getElementById("mood").textContent = "sad";
        document.getElementById("mood").style.color = "blue"
    }

    else {
        document.getElementById("show").textContent = "I'm";
        document.getElementById("mood").textContent = "happy";
        document.getElementById("mood").style.color = "blue"
    }
}
<body>
<h1>What's your mood ?</h1>
    <label>Mood: <input type = "text" id = "test" name = "test" required minlength = "2" maxlength = "8" size = "10" /></label>
    <button id = "valider">Check</button>
    <hr/>
    <p id = "show"><span id = "mood"></span></p>
</body>

Я не знаю, почему, когда я нажимаю на кнопку, у меня появляется только «Я», а не «Я счастлив» или «Мне грустно» с синим цветом «Счастлив» (или «Грустно»).

Я хочу полное предложение «Я счастлив» или «Мне грустно».

Я думаю, это потому, что тег span находится внутри тега p, потому что я видел, что это может работать только с тегом span. Если я помню, но не знаю, почему это не работает внутри тега p.

Может быть, потому, что тег span в элементе строчного уровня, а p является блочным элементом?

Проверьте консоль разработчика на наличие ошибок. Кроме того, <h1>...</h1> должен находиться внутри тега body.

mykaf 29.05.2024 22:45

Я думаю, вы правы в своем предположении, что это связано с тем, что тег span находится в элементе строкового уровня, а p является блочным элементом.

Agota Kristof 29.05.2024 22:55

Да, глупая ошибка, отредактирую, спасибо, mykaf!

Aurel-BG 29.05.2024 22:56
Поведение ключевого слова "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
3
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я думаю, это потому, что тег span находится внутри тега p.

Да, но, возможно, не по той причине, о которой вы думаете. Поскольку элемент id = "mood" находится внутри элемента id = "show", то когда вы это сделаете:

document.getElementById("show").textContent = "I'm";

Вы эффективно уничтожаете этот контент. В этот момент элемент id = "mood" больше не существует. Итак, следующая строка выдает ошибку:

document.getElementById("mood").textContent = "happy";

Вы можете наблюдать эту ошибку в консоли разработки вашего браузера.

Вместо того, чтобы вкладывать целевые теги друг в друга и беспокоиться о сохранении их содержимого, просто используйте два элемента, вложенных внутри контейнера. Отредактируйте содержимое этих двух элементов, оставив контейнер как есть. Например:

const valide = document.querySelector("#valider");
valide.addEventListener("click", valider);

function valider() {;
    let showEmotion = document.getElementById("test").value;

    if (showEmotion === "happy") {
        document.getElementById("show").textContent = "I'm";
        document.getElementById("mood").textContent = "happy";
        document.getElementById("mood").style.color = "blue"
    }
    else if (showEmotion === "sad"){
        document.getElementById("show").textContent = "I'm";
        document.getElementById("mood").textContent = "sad";
        document.getElementById("mood").style.color = "blue"
    }

    else {
        document.getElementById("show").textContent = "I'm";
        document.getElementById("mood").textContent = "happy";
        document.getElementById("mood").style.color = "blue"
    }
}
<h1>What's your mood ?</h1>
<body>
    <label>Mood: <input type = "text" id = "test" name = "test" required minlength = "2" maxlength = "8" size = "10" /></label>
    <button id = "valider">Check</button>
    <hr/>
    <p><span id = "show"></span> <span id = "mood"></span></p>
</body>

Спасибо, Дэвид, это работает, но у меня есть только один вопрос: могу ли я использовать дважды один и тот же идентификатор для тега span? Я имею в виду, это не «плохая практика»?

Aurel-BG 29.05.2024 22:59

Если вам нужно несколько элементов с одинаковой идентичностью — одинаковым дизайном, вместо использования идентификатора используйте класс

Agota Kristof 29.05.2024 23:08

Хорошо, я тоже об этом подумал, спасибо, Агота!

Aurel-BG 29.05.2024 23:11

Я думаю, что эта проблема связана со свойством textContent, и вместо него вам следует использовать свойство InnerHTML.

например вместо этого кода:

 if (showEmotion === "happy") {
document.getElementById("show").textContent = "I'm";
document.getElementById("mood").textContent = "happy";
document.getElementById("mood").style.color = "blue"

}

напишите этот код:

     if (showEmotion === "happy") {
    document.getElementById("mood").innerHTML = "happy";
    document.getElementById("mood").style.color = "blue"
    document.getElementById("show").innerHTML = "I'm" + document.getElementById("mood").innerHTML;

}

потому что, когда вы пишете этот код, элемент «span» в элементе «p» будет удален из содержимого «span»:

document.getElementById("show").textContent = "I'm";

И вам нужно использовать свойство InnerHTML для распознавания тегов HTML.

Про перезапись я не говорил, в этом методе остаются и элементы span, и p и получается желаемый результат. В противном случае есть лучшие способы сделать это.

Ehsan Aryan 29.05.2024 23:04

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