Событие Onclick не работает для создания нового заголовка

#javascript #html #arrays #function #getelementsbyclassname

#javascript #HTML #массивы #функция #getelementsbyclassname

Вопрос:

Я создаю генератор текста. Я пытаюсь написать функцию на JavaScript, в которой при нажатии на выбор в выпадающем меню сохраняется текст, соответствующий этому выбору, и при нажатии кнопки «Создать» этот сохраненный текст отображается как заголовок страницы.

Проблема: неправильный текст отображается в качестве заголовка, когда я нажимаю кнопку «Сгенерировать». Кроме того, когда я хочу выбрать другой вариант, заголовок никогда не меняется. Как мне это исправить?

Что я пробовал до сих пор, так это:

 var x;
var y;

function format1Select(){
    x = document.getElementsByClassName("formats")[0];
    y = document.getElementsByClassName("nav")[0];
    y.innerHTML = x.innerHTML   "  ";
} //to select choice 1

function format2Select(){
    x = document.getElementsByClassName("formats")[1];
    y = document.getElementsByClassName("nav")[0];
    y.innerHTML = x.innerHTML   "  ";
} //to select choice 2

function format3Select(){
    x = document.getElementsByClassName("formats")[2];
    y = document.getElementsByClassName("nav")[0];
    y.innerHTML = x.innerHTML   "  ";
} // to select choice 3

function generate() {
    if (x = document.getElementsByClassName("formats")[0]) {
        x != document.getElementsByClassName("formats")[1];
        x != document.getElementsByClassName("formats")[2];
       format1 = "I am";
        i = document.getElementsByTagName("h1")[0];
        i.innerHTML = format1;
    } else if (x = document.getElementsByClassName("formats")[1]) {
        x != document.getElementsByClassName("formats")[0];
        x != document.getElementsByClassName("formats")[2];
       format2 = "I believe";
       i = document.getElementsByTagName("h1")[0];
       i.innerHTML = format2;
    } else {
       x != document.getElementsByClassName("formats")[0];
       x != document.getElementsByClassName("formats")[1];
       format3 = "I will";
       i = document.getElementsByTagName("h1")[0];
       i.innerHTML = format3;
    }
}
  

HTML, который я использовал:

     <div class="show"><div class="nav"> Choose Format  </div></div>
    <div class="hide">
 
    <div class="formats" onclick="format1Select()">I am...</div>
    <div class="formats" onclick="format2Select()">I believe...</div>
    <div class="formats" onclick="format3Select()">I will...</div>
</div>

</div> <br>
<div id="opt">
    <div class="options" onclick="generate()">Generate</div>
    <div class="options"><a href="">Survey</a></div>
</div>
  

Комментарии:

1. Пожалуйста, добавьте HTML-код, который вы также использовали

2. x != document.getElementsByClassName("formats")[1]; x != document.getElementsByClassName("formats")[2]; что вы подразумеваете под этими выражениями, вы не используете возвращаемое значение!

3. @HarshanaSerasinghe добавил HTML-код

4. и if(x = document.getElementsByClassName("formats")[1] ) { вы присваиваете, а не проверяете! это должно быть == вместо =

5. @SaymoinSam Я использовал их в попытке убедиться, что эти другие значения не сохраняются.

Ответ №1:

Это более элегантное решение, которое устраняет некоторое дублирование кода и немного легче читается.

Это также упрощает добавление параметров в выпадающий список, который у вас есть, потому что вам нужно только добавить еще один элемент в свой список в HTML

 //Here we get an array of the format elements (well its actually an HTMLCollection, but that's unimportant here)
let formats = document.getElementsByClassName('formats');

//This is a variable that will let us store the currently selected format
let selectedFormat = '';

//We loop through all the format elements and add an 'onclick' event handler
for (let format of formats) {
    format.onclick = (event) => {
        //We grab the formats text from the HTML itself to set the variable
        selectedFormat = event.target.innerText;
    };
}

//This adds an event to the generate button to actually change the title when clicked
document.getElementsByClassName('options')[0].onclick = () => {
    let el = document.getElementsByTagName('h1')[0];
    el.innerHTML = selectedFormat;
};
  

Кроме того, вашему HTML с этим JavaScript не нужно будет вызывать JS непосредственно в атрибуте onclick, вы можете просто сделать это в цикле JS выше (тогда вам не нужно писать целую новую функцию для добавления чего-либо в список)

     <div class="show"><div class="nav"> Choose Format  </div></div>
    <div class="hide">
 
    <div class="formats">I am...</div>
    <div class="formats">I believe...</div>
    <div class="formats">I will...</div>
  

Другой вариант, если вы когда-либо хотели, чтобы значения, указанные в заголовке, отличались от фактического текста меню, вы можете использовать атрибуты данных, подобные этому:

 <div class="formats" data-format="I am!">I am...</div>
  

Затем в цикле вы можете использовать это, чтобы установить значение, отличное от значения в меню

 let selectedFormat = '';
//...
    selectedFormat = event.target.dataset.format;
//...