Мне нужно изменить видимость двух текстов, но мне не нужна кнопка переключения, а только один значок, который при нажатии скрывает текст1 и показывает текст2 и возвращается обратно при повторном нажатии.
Я использую:
<span onclick = "document.getElementById('text1').innerHTML = (this.innerHTML == document.getElementById('text1').innerHTML) ? document.getElementById('text2').innerHTML : document.getElementById('text1').innerHTML"><i class = "fa fa-comments" aria-hidden = "true"></i></span>and
<div class = "content">
<div id = "text1">
<h1>Welcome</h1>
<p>English text</p>
</div>
<div id = "text2">
<h1>Välkommen</h1>
<p>Swedish text</p>
</div>
</div>Обновлено: ответ Мигеля Г решает эту проблему. Тем не менее, я все еще пытаюсь выяснить, как изменить текст в других разделах по всей странице.
Какой конкретно вопрос у вас есть? Вы получаете какие-либо ошибки?
извините, я думал, что кнопка переключения похожа на переключатель из стороны в сторону. Я использую только простой значок. Но код не меняет местами тексты, они просто появляются оба, и значок ничего не делает.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хорошо, я сделал много изменений в вашем коде, я не знаю, было ли это именно то, что вы ожидали, но вот оно.
Чтобы добиться желаемого поведения отображения содержимого, соответствующего каждому тексту, когда пользователь щелкает соответствующий элемент, вам потребуется внести некоторые изменения в код HTML и добавить JavaScript.
В этом примере я добавил код для переключения отображения текста, соответствующего нажатой кнопке. Если текст виден, он будет скрыт, и наоборот. Кроме того, я добавил цикл для скрытия всех текстов, кроме текста, соответствующего текущей нажатой кнопке. Благодаря этим изменениям вы можете нажимать кнопки, чтобы отображать и скрывать соответствующий контент.
<style>
.text {
display: none;
}
</style>
<!-- add a class to each button -->
<span class = "btn" data-target = "#text1"><i class = "fa fa-comments" aria-hidden = "true"></i>English</span>
<span class = "btn" data-target = "#text2"><i class = "fa fa-comments" aria-hidden = "true"></i>Swedish</span>
<div class = "content">
<div id = "text1" class = "text">
<h1>Welcome</h1>
</div>
<div id = "text2" class = "text">
<h1>Välkommen</h1>
</div>
</div>
<!-- JavaScript code -->
<script>
const buttons = document.querySelectorAll('.btn');
const texts = document.querySelectorAll('.text');
buttons.forEach(button => {
let isTextVisible = false;
button.addEventListener('click', () => {
// Get button target
const target = button.getAttribute('data-target');
const text = document.querySelector(target);
// Hides all texts except the current text
texts.forEach(t => {
if (t !== text) {
t.style.display = 'none';
}
});
// Shows or hides the text corresponding to the clicked button
if (isTextVisible) {
text.style.display = 'none';
isTextVisible = false;
} else {
text.style.display = 'block';
isTextVisible = true;
}
});
});
</script>
спасибо, Ширли, не лучшая идея без JS? Я надеялся, что это можно сделать просто в HTML.
@artvanderlay в вашем HTML есть огромная строка JSonclick, это не «просто HTML». Вы можете поместить тег <script> так же, как и любой другой тег.
хорошо, но я понимаю, что решение Ширли имеет две кнопки, и я стараюсь избегать этого. Я ошибочно назвал это переключением, но я стараюсь, чтобы один элемент не менялся по внешнему виду.
Обновлено: Хорошо, я думаю, что знаю, о чем вы просите. Вы хотите иметь возможность щелкнуть кнопку или что-то еще, чтобы переключить внутренний HTML этих двух div. Вы можете сделать это следующим образом:
<button type = "button" onclick = "toggle()">Click Me!</button
<div class = "content" style = "display: inline;">
<div id = "text1">
<h1>Welcome</h1>
<p>English text</p>
</div>
<div id = "text2" style = "display: none;">
<h1>Välkommen</h1>
<p>Swedish text</p>
</div>
</div>
Для вашего HTML вы можете поместить свойство onclick непосредственно в верхний div или вы можете поместить его в отдельную кнопку. Это зависит от вас. Для этого я добавил кнопку поверх div, чтобы вы могли переключаться между двумя вариантами. Я также добавил некоторые начальные стили в div, чтобы показать, что происходит.
const toggle = () => {
let el1 = document.getElementById("text1");
let el2 = document.getElementById("text2");
el1.style.display.includes('none') ? el1.style.display = 'inline' : el1.style.display = 'none';
el2.style.display.includes('none') ? el2.style.display = 'inline' : el2.style.display = 'none';
}
Это функция JavaScript, которая поменяет местами ваши элементы div. По сути, сейчас мы просто проверяем стиль каждого div, и если он виден, мы делаем его невидимым, а если он не виден, мы делаем его видимым. Используя свойство none, мы гарантируем, что они появятся в одном и том же месте.
Вы можете поместить эту функцию в тег script, и она должна работать! Дайте мне знать, как это происходит.
Спасибо, Мигель, это почти то, что мне нужно, но вместо того, чтобы менять местами текст 1 и 2, я хочу, чтобы они заменяли друг друга: при загрузке виден только текст1, при нажатии виден только текст2 и в том же положении, что и текст1. Тексты являются переводами, и я хочу, чтобы они переключались только при нажатии кнопки/значка, чтобы избежать полной перезагрузки страницы и изображения.
... чтобы быть видимым индивидуально.
Понятно! Тогда я, должно быть, неправильно понял вопрос. Дайте мне одну минуту, и я посмотрю, смогу ли я отредактировать свой ответ для вас.
Хорошо, я отредактировал свой ответ, чтобы отразить то, что вы сказали. Позвольте мне знать, если это помогает
Работает очарование. Большое спасибо, Мигель!
К сожалению, я не могу голосовать. Новичок.
Мигель, еще один вопрос: у меня есть разные разделы текста, я добавил идентификаторы div, но текст не меняется. Что мне нужно сделать, чтобы изменить текст на всей странице?
Вы должны иметь возможность «выбрать ответ». Кроме того, если ваш текст находится в div с идентификаторами «text1» и «text2», он должен работать. Если вам нужен третий раздел, то моя функция js не будет работать. Мы должны были бы сделать это по-другому. Если вы меняете идентификаторы div, просто убедитесь, что вы изменили их и в функции.
Да, я повторяю div и id в другом разделе той же страницы, но там ничего не меняется. Я не понимаю, почему. Для ясности: текст1 — английский, текст2 — другой язык, и я хочу, чтобы тексты менялись по всему сайту.
Думаю, мне также нужна какая-то функция, которая сохраняет смену языка при переходе на другую страницу.
Функция document.getElementById("id") получит ПЕРВЫЙ элемент с идентификатором "id". Таким образом, либо вам нужно поместить ВЕСЬ текст на одном языке в один div, либо вы можете сделать это по-другому, возможно, используя класс, а затем извлекая все элементы с этим именем класса.
и как лучше всего сохранить смену языка на всем сайте, чтобы пользователю не приходилось нажимать кнопку на каждой странице?
Я не знаю, правильно ли это, но я добавляю этот ответ на всякий случай.
function onloadtext(){
document.getElementById("text1").innerHTML = `<h1>Welcome</h1><p>English text</p>`;
}
const toggle = () => {
let el1 = document.getElementById("text1");
let btn = document.getElementById("toggle");
if (btn.value == 'Swedish'){
btn.value = 'English';
el1.innerHTML = `<h1>Välkommen</h1><p>Swedish text</p>`;
}else{
btn.value = 'Swedish';
el1.innerHTML = `<h1>Welcome</h1><p>English text</p>`;
}
}<body onload = "onloadtext()">
Translate in:<input type = "button" id = "toggle" onclick = "toggle()" value = "Swedish">
<div class = "content">
<div id = "text1"></div>
</div>
</body>Я понимаю, что вместо того, чтобы поменять местами содержимое text1 и text2, вы хотите скрыть одно и сделать видимым другое. Я надеюсь, что приведенный ниже код поможет.
var text1=document.getElementById('text1');
var text2=document.getElementById('text2');
const swap = () => {
if (text1.classList.contains("hidden")){ //if text1 contains class 'hidden'
text1.classList.remove("hidden"); //remove hidden class from text1
text2.classList.add("hidden"); //add hidden class to text2
}
else{
text1.classList.add("hidden"); //add hidden class to text1
text2.classList.remove("hidden"); //remove hidden class from text2
}
}.hidden{
display:none;
}<button onclick = "swap()">Switch Text</button>
<div class = "content">
<div id = "text1">
<h1>Welcome</h1>
<p>English text</p>
</div>
<div id = "text2" class = "hidden">
<h1>Välkommen</h1>
<p>Swedish text</p>
</div>
</div>Спасибо! Я тоже попробую. Размещать ли var text1=document.getElementById('text1'); вар текст2 = документ.getElementById ('текст2'); в <script> и .hidden{ display:none; } слишком?
Вы должны поместить .hidden{ display:none;} между тегами <style></style> или в отдельный файл .css. Кроме того, другие коды, которые вы запрашиваете, должны быть помещены между тегами <script></script> или в отдельном файле .js. Коды в порядке фрагментов кода в моем ответе следующие: 1. HTML-код 2. CSS-код 3. Javascript-код Перейдите по этой ссылке, чтобы узнать, как добавить javascript в HTML; digitalocean.com/community/tutorials/…
Спасибо! Заменит ли это все тексты на одной странице в разных разделах, если я дам им правильный идентификатор?
Зависит от того, что вы подразумеваете под all texts. В случае text1 и text2 да, но если вы добавите text3, вам нужно обновить код javascript.
только текст1 и текст2. Я пробовал ваш код, но, похоже, он только меняет позиции, а не видимость. Наверное, я был неясен в своем вопросе, моя вина! Мигель отредактировал свой код, и он работает нормально, но мне не удалось понять, почему тексты не меняются в других разделах на той же странице.
Это должно работать.
<div id = "swap-button" style = "cursor: pointer;">Click Me</div>
<div class = "content">
<div id = "text1">
<h1>Welcome</h1>
<p>English text</p>
</div>
<div id = "text2">
<h1>Välkommen</h1>
<p>Swedish text</p>
</div>
</div>
<script>
const swapText = () => {
const text1Element = document.getElementById('text1');
const text2Element = document.getElementById('text2');
const text1 = text1Element.innerHTML;
text1Element.innerHTML = text2Element.innerHTML;
text2Element.innerHTML = text1;
};
document.getElementById('swap-button').onclick = () => {
swapText();
};
</script>
Просто добавьте свой значок вместо
<div id = "swap-button" style = "cursor: pointer;">Click Me</div>
также поменять местами не видимость. Извините, что не четко спросил!
«всего один значок, который при нажатии меняет текст1 на текст2 и возвращается обратно при повторном нажатии», но это «кнопка переключения».