Подтвердить что ты не робот

Ошибка JQuery Duplicate Selector

В настоящее время я пытаюсь настроить таблицу с 6 кликами, которые позволяют отображать окно ввода, чтобы вы могли добавлять комментарии, но я получаю дублируемую ошибку селектора jQuery, а также через отладку второй функции, которую я обнаружил, что .html() не работает. Вот мой код для 6 функций; каждый из которых вызывается при нажатии на конкретную ячейку:

$("#mondayCommentLink").click(function (){
    var mondayhtmls = $("#mondayComment");
    var input = $("<input type='text' id='mondayCommentText' name='mondayCommentText'  />");
    input.val(data.days[0].comment);
    mondayhtmls.html(input);
});

$("#tuesdaysCommentLink").click(function (){
    var tuesdayhtmls = ("#tuesdayComment");
    var inputt = $("<input type='text' id='tuesdayCommentText' name='tuesdayCommentText' />");
    inputt.val(data.days[1].comment);
    tuesdayhtmls.html("test");
});

$("#wednesdayCommentLink").click(function (){
    var htmls = ("#wednesdayComment");
    var input = $("<input type='text' id='wednesdayCommentText' name='wednesdayCommentText' />");
    input.val(data.days[2].comment);
    htmls.html(input);
});

$("#thursdayCommentLink").click(function (){
    var htmls = ("#thursdayComment");
    var input = $("<input type='text' id='thursdayCommentText' name='thursdayCommentText' />");
    input.val(data.days[3].comment);
    htmls.html(input);
});

$("#fridayCommentLink").click(function (){
    var htmls = ("#fridayComment");
    var input = $("<input type='text' id='fridayCommentText' name='fridayCommentText' />");
    input.val(data.days[4].comment);
    htmls.html(input);
});

$("#saturdayCommentLink").click(function (){
    var htmls = ("#saturdayComment");
    var input = $("<input type='text' id='saturdayCommentText' name='saturdayCommentText' />");
    input.val(data.days[5].comment);
    htmls.html(input);
});

И здесь они вызываются из:

  <th id="mondayComment" name="mondayComment" style="text-align: center; width: 115px;"><div id="mondayCommentLink">+</div></th>
  <th id="tuesdayComment" name="tuesdayComment" style="text-align: center; width: 115px;"><div id="tuesdaysCommentLink">+</div></th>
  <th id="wednesdayComment" name="wednesdayComment" style="text-align: center; width: 115px;"><div id="wednesdayCommentLink">+</div></th>
  <th id="thursdayComment" name="thursdayComment" style="nowrap; text-align: center; width: 115px;"><div id="thursdayCommentLink">+</div></th>
  <th id="fridayComment" name="fridayComment" style="text-align: center; width: 115px;"><div id="fridayCommentLink">+</div></th>
  <th id="saturdayComment" name="saturdayComment" style="text-align: center; width: 115px;"><div  id="saturdayCommentLink">+</div></th> 

Я не понимаю, почему я получаю дублирующую ошибку выбора на #mondayCommentLink, #tuesdayCommentLink и т.д. Есть ли что-то, что я пропускаю или ошибочно делаю неправильно? Первая ячейка работает, и я могу щелкнуть ее, и появится окно ввода, но оно не будет выполнено во второй ячейке #tuesdayCommentLink в строке tuesday.htmls.html("test");.

4b9b3361

Ответ 1

Нет такой ошибки Duplicated jQuery Selector; что предупреждение, выпущенное IntelliJ (и другими IDE от идеи, такой как WebStorm...), предполагает, что вы должны сохранить свой выбор jQuery в локальной переменной, а не повторять выбор.

Выдержка из документации jQuery:

Сохранение выбора

jQuery не кэширует элементы для вас. Если вы сделали выбор, который может понадобиться сделать снова, вы должны сохранить выбор в переменной, а не повторять выбор.

1| var divs = $( "div" );

Как только выбор будет сохранен в переменной, вы можете вызвать методы jQuery для переменной так же, как вы бы назвали их в исходном выборе.

Выбор выбирает только элементы, которые находятся на странице во время выбора. Если элементы будут добавлены на страницу позже, вам придется повторить выбор или иначе добавить их в выборку, хранящуюся в переменной. Сохраненные выделения не изменяют магию при изменении DOM.

Однако в вашем коде нет дублированного выбора jQuery, поэтому я уверен, что это предупреждение происходит откуда-то еще. Что соответствует тому факту, что ошибка сохраняется после добавления отсутствующего $.

В целом хорошая практика добавить сообщенную ошибку на ваши вопросы.

Ответ 2

"Повторяющийся селектор" действительно является предупреждением JS lint, которое вы увидите в IDE, например PHPStorm/WebStorm. По соображениям производительности вы захотите кэшировать свои селекторы, когда это возможно... например:

(function($) {
  var 
    $mondayCommentLink = $("#mondayCommentLink"),
    $mondayHtmls = $("#mondayComment"),
    $inputMonday = $("<input type='text' id='mondayCommentText' name='mondayCommentText'  />");

    $mondayCommentLink.on('click', function() {
      $inputMonday.val(data.days[0].comment);
      $mondayHtmls.html($inputMonday);
    });

})(jQuery);

.. и так далее. Я только что сделал в понедельник, но вы продолжаете добавлять ссылку на переменную для селектора, которую вы можете захватить уже в памяти. Что-то еще сложнее при работе с AJAX или если у вас несколько областей, но это основная идея. Это просто соглашение, но мне легче ориентировать селектора с var $elem и camelcased.

Ответ 3

У меня была такая же ошибка, попробовав что-то вроде этого:

if  ($("#checkbox").is(':checked')){
   value = $("#checkbox").val();

По какой-то причине ошибка была сброшена на "#checkbox". Я решил проблему, включив в нее:

//noinspection JSJQueryEfficiency в верхней части инструкции if:

 //noinspection JSJQueryEfficiency
 if  ($("#checkbox").is(':checked')){
   value = $("#checkbox").val();

и сообщение об ошибке исчезло.