Проблема с jQuery .attr. $(‘#id’).attr(‘значение’); возвращает неопределенное

#javascript #jquery

#javascript #jquery

Вопрос:

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

             var calBtn = $('#calButton').attr('value');
        function disappearingTable() {
            if (calBtn = 'Turn Calendar Off') 
            {
                $('.calendarLayer').toggle();
                $('#calButton').attr('value', 'Turn Calendar On');
            }
            else if (calBtn = 'Turn Calendar On') 
            {
                $('.calendarLayer').toggle();
                $('#calButton').attr('value', 'Turn Calendar Off');
            }
        }
  

Это в тегах скрипта в заголовке. Тогда в теле у меня есть это.

 <form id="calendarForm" action="javascript:void(0);">
                <input type="submit" id="calButton" value="Turn Calendar Off" onclick="disappearingTable()" />
            </form>
  

Я не могу понять это ни за что на свете. Даже когда я пробовал обычный Javascript, я все еще получаю undefined. Кто-нибудь помогает? Спасибо!

Ответ №1:

= это оператор присваивания, который вы должны использовать === или == для равенства:

 if (calBtn == 'Turn Calendar Off') 
{
    $('.calendarLayer').toggle();
    $('#calButton').attr('value', 'Turn Calendar On');
}
else if (calBtn == 'Turn Calendar On') 
{
    $('.calendarLayer').toggle();
    $('#calButton').attr('value', 'Turn Calendar Off');
}
  

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

1. Спасибо за совет, но он все еще не работает. Если я переключусь на ==, вообще ничего не произойдет. При = переключатель срабатывает повторно, и текст меняется на «Включить календарь», но никогда не меняется после первого нажатия. Забавы ради я добавил document.write(calBtn); именно так я пришел к выводу, что у меня проблема с attr (не определена).

2. Вы должны использовать, === пока не будете знать на 100%, что == делает.

3. Будет сделано. На самом деле я просмотрел и изменил все == на === и != на !== ранее, когда запускал свой код через валидатор. Именно тогда мне и удалось испортить свою функцию. Затем, пытаясь выяснить, что произошло, я изменил все это обратно и сумел еще больше испортить равенство в функции. Спасибо

Ответ №2:

Во-первых, как сказано в no.good.at.coding = , является оператором присваивания и неверен, даже если он работает. == или === используется для проверки равенства

Кроме этого, если я ничего не упускаю, значение переменной calBtn устанавливается только один раз вне функции. Всякий раз, когда вызывается функция для получения другого значения calBtn , его необходимо изменять в функции или извлекать из элемента dom при каждом вызове функции .

попробуйте это..

 function disappearingTable() {
            var calBtn = $('#calButton').attr('value');
            if (calBtn ==='Turn Calendar Off') 
            {
                $('.calendarLayer').toggle();
                $('#calButton').attr('value', 'Turn Calendar On');
            }
            else if (calBtn === 'Turn Calendar On') 
            {
                $('.calendarLayer').toggle();
                $('#calButton').attr('value', 'Turn Calendar Off');
            }
        }
  

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

1. Вам следует обновить свой ответ правильными операторами равенства.

2. facepalm Я переместил переменную внутрь, и теперь она работает. Я не понимаю, как мне удалось переместить его за пределы функции. Однако, когда это было там, я не думал, что это неправильно. Я все еще действительно новичок в Javascript и jQuery. Спасибо за помощь.

Ответ №3:

В дополнение к проверкам равенства, которые все еще необходимо изменить, я думаю, у вас проблема, связанная с подразумеваемыми глобальными значениями, потому что ваша переменная calButton находится вне вашей функции.

Что, если вы переработали свой код следующим образом:

 $('#calButton').click(function(e) {
    var element = $(this);
    var value = element.val();
    var layer = $('.calendarLayer');

    if (value === 'Turn Calendar Off') {
        layer.toggle();
        element.attr('value', 'Turn Calendar On');
    } else if (value === 'Turn Calendar On') {
        layer.toggle();
        element.attr('value', 'Turn Calendar Off');
    }
});

<form id="calendarForm">
    <input type="submit" id="calButton" value="Turn Calendar Off" />
</form>
  

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

1. Это действительно была проблема. Я также исправил проверку на равенство. Спасибо