wbrapist
@wbrapist
Ты в порядке?

Почему функция постоянно возвращает undefined?

Вечер.

Возникла проблема. Написал свой первый JS-говнокод. Проблема при возврате функцией значения.

Есть кнопка - при нажатии на неё открывается меню, в меню есть чекбокс в виде обычного DIV'а. При нажатии на этот чекбокс - пытаюсь обработать текущее состояние, т.е. стоит галочка или нет.

Получается, идёт обработка (внешнего) клик-события, потом внутри него ещё одно клик-событие.

Дело в том, что функция setCheckBox() постоянно возвращает undefined. Почему?

Вот нерабочий код с комментариями в нужных местах. Скорее всего, я не понимаю, что происходит при вызовах функций, в частности, при обработке событий, и в итоге что-то идёт не так, как надо.
  • Вопрос задан
  • 581 просмотр
Решения вопроса 3
@Coder321
6bf4c400b96c446d9b2702a8e4bae34b.png
В момерт когда вы возвращаете result асинхронное собитие onclick ещу не наступило. При этом, при каждом открытии меню у вас будет создаваться обработчик события что чревато не предсказуемым поведением и утечкой памяти.
Ответ написан
Комментировать
@Arik
Это события и они наступят когда-то в будущем и тогда и надо вызывать след. действие, а не менять свойство что что-то изменилось, либо на это свойство вешать событие что оно изменилось. Для проверки выбран чекбокс или нет можно просто у него и спросить
document.getElementById("checkbox").checked === true
Ответ написан
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
во первых, хочу поблагодарить создателей jquery, счастья, здоровья, всех благ и долгих лет жизни. Я глаза сломал и мозг вывихнул, пока натив этот читал. Это к спорам о жквери вс натив жс. Жирный плюс жк за читаемость кода. Я все понял, но это какой-то Содом и Гоморра.
Во вторых - как вам уже Arik намекнул, в функции вы не выполняете этот иф, который так вас раздражает отсутствием реакции. Вы создаете слушателя, который при срабатывании клика отработает этот иф. По этому var result = setCheckBox(); выдает андефайнед, с резалтам внутри ничего не происходит.
В третьих - выставить в фиддл код и не вписать хтмл и цсс - это вообще за гранью добра и зла.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
dicem
@dicem
Попробуй занулить переменную при объявлении, или любое дефолтное значение ему запихать типа
var result = true;
Ответ написан
wbrapist
@wbrapist Автор вопроса
Ты в порядке?
Сделал немного по-другому. При клике на меню отрабатывало событие - там добавлялся HTML, повесил второе клик-событие не отдельно где-то в коде, а сделал его в виде атрибута (т.е. вместо старой разметки):
elementAddMenu.innerHTML += '<div class="checkbox"></div>

Немного изменил, добавил обработчик:
elementAddMenu.innerHTML += '<div class="checkbox" onclick="setCheckBox()"></div>

А сама функция при каждом клике вызывается и пишет значение в глобальную переменную.

Пока что только так. Сейчас попробую всё-таки поймать событие, написав обработчик в коде - нужно понять конкретнее, что происходит.

Всем спасибо за разъяснения и непосредственно участие.

UPD
Переделал без использования глобальной переменной, обработчик находится внутри другого.
var checkbox = document.getElementsByClassName('checkbox')[0];

    checkbox.onclick = function() {
      result = setCheckBox(checkbox);
    };
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы