Javascript не может вызвать элемент в массиве

Хорошо, позвольте мне объяснить больше ... цель состоит в том, чтобы установить флажок, если есть изменения в select. Фактический код был:

function checkit(date)
{
  document.forms[0].date.checked = true;
}


<input type = "checkbox" name = "date[]" value = "2008-08-14">Aug 14, 2008<br> 
 <select name = "slot[]" size = "1" onchange = "checkit(date[]);"/>
 <option value = "2008-08-15;0900;1700">9am to 5pm</option>       
 <option value = "2008-08-15;1330;1730">1:30pm to 5:30pm</option>
 </select>

  <input type = "checkbox" name = "date[]" value = "2008-08-15">Aug 14, 2008<br> 
 <select name = "slot[]" size = "1" onchange = "checkit(date[]);"/>
 <option value = "2008-08-15;0900;1700">9am to 5pm</option>       
 <option value = "2008-08-15;1330;1730">1:30pm to 5:30pm</option>
 </select>

<input type = "checkbox" name = "date[]" value = "2008-08-16">Aug 14, 2008<br> 
 <select name = "slot[]" size = "1" onchange = "checkit(date[]);"/>
 <option value = "2008-08-15;0900;1700">9am to 5pm</option>       
 <option value = "2008-08-15;1330;1730">1:30pm to 5:30pm</option>
 </select>

В PHP, если он видит переменную с [], он автоматически создает массив. В Javascript я ожидал, что Javascript распознает [] и выполнит его на основе текущего элемента. Например, если я выберу значение во втором флажке, оно должно запустить событие, чтобы установить флажок этого элемента. Я не хочу называть переменную как date1, date2, date3, date4 ... Надеюсь, это проясняет больше. Я знаю, что что-то упускаю ... Я попробовал ключевое слово this, чтобы превратить его в этот текущий элемент, но похоже, что это не работает, но, возможно, я использовал неправильный синтаксис.

Я ожидал, что это событие onchange, оно должно активировать свой аргумент «date []», но я предполагаю, что Javascript должен знать, какой элемент в date [] он будет использовать вместо того, чтобы явно вызывать его date [1] и так далее. Функция checkit получает имя "date []" и проверяет этот флажок date [].

Кстати, большое спасибо за дополнительные ответы (я узнал кое-что новое!)

кто-то должен рассказать новым плакатам о функции форматирования кода. я вижу <pre> столько раз в вопросе ...

Johannes Schaub - litb 23.12.2008 10:22

pre в основном в порядке ... кого волнует выделение небольших фрагментов? Я не.

Vinko Vrsalovic 23.12.2008 10:53

@Vinko Vrsalovic: В этом случае было бы очевидно, что исходный постер имел недопустимую разметку (забыл закрыть кавычки onchange)

some 23.12.2008 11:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
1 184
4

Ответы 4

Что именно вы пытаетесь сделать с этим кодом?

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

Чего именно вы пытаетесь достичь?

Попробуйте этот код:

function checkit(date)
   {
    var date = document.getElementById(date);
    date.checked = true;
   }
<input type = "checkbox" id = "date[1]" value = "2008-08-14" onchange = "checkit('date[1]')");/>Aug 14, 2008<br /> 
<input type = "checkbox" id = "date[2]" value = "2008-08-14" onchange = "checkit('date[2]')");/>Aug 14, 2008<br /> 
<input type = "checkbox" id = "date[3]" value = "2008-08-14" onchange = "checkit('date[3]')");/>Aug 14, 2008<br /> 

Это не работает, потому что (как дреассказал) в вашем HTML-коде есть ошибки, и вы называете свои переменные способом, который конфликтует с синтаксисом javascript.

Имя вашего ввода - дата [1], а [ и ] имеют особое значение в коде javascript.

В этом коде:

document.forms[0].date.checked = true;

вы пытаетесь сначала получить доступ к форме документа (document.forms [0]), а затем пытаетесь получить доступ к полю с именем Дата, но его нет. Согласно вашей HTML-разметке у вас есть поля с именами «дата [1]», «дата [2]» и «дата [3]».

Но вы их не может получить доступ вот так:

document.forms[0].date[1].checked = true;

Почему? Поскольку дата [1] пытается проиндексировать Дата с помощью 1, и в этом случае ваш Дата не является массивом.

Вы может получить доступ это если заключите в кавычки:

document.forms[0]["date[1]"].checked = true;

Обратите внимание, что теперь «дата [1]» используется как строка.

PHP имеет синтаксис arr[] = something для размещения чего-либо в следующем доступном индексе в массиве.

В Javascript такого синтаксиса нет; если вы хотите поместить что-то в следующий доступный индекс в массиве, используйте вместо этого arr.push(something).

Но часть вашего примера, о которой вы говорите, написана в HTML, а не в Javascript. Javascript обращается к нему, но сами поля формы создаются в HTML ... поэтому вы должны дать ему свое собственное имя, а не автоматически увеличивающееся имя.

Если вы создаете HTML динамически с помощью вызовов DOM (например, для каждого элемента ввода, document.createElement('input'), назначьте атрибуты, а затем appendChild() для основной формы), вы можете автоматически назвать поля формы ... но это совершенно другой метод создания HTML & имеет кучу подводных камней, на которые следует обратить внимание.

Во-первых, вы хотите использовать специфичную для PHP функцию в Javascript. Нет, насколько я могу судить, такой функции нет.

Во-вторых, я настоятельно рекомендую не использовать имена ввода HTML, такие как «date [1]» ... чтобы мощь был легальным HTML (мне пришлось бы попробовать его в нескольких браузерах, чтобы убедиться, что это действительно разрешено), но это почти на 100% является вероятным источником ошибок в цикле обслуживания.

Я предполагаю, что этот код либо автоматически сгенерирован для вас, либо вы просто хотите взять блок и скопировать / вставить в своем редакторе. Если это первое, я бы назвал элементы «date_1» в коде автогена и покончил с этим. В последнем случае вы можете либо сохранить номер в своем коде (т. Е. Вручную ввести от date_1 до date_257), либо использовать вызов Javascript document.write, чтобы сгенерировать HTML с меньшими усилиями. Я бы сделал ТОЛЬКО последнее (document.write out HTML), если на самом деле нет другого пути. Если вы говорите о 10-25 копиях, ручная обработка этого вручную вряд ли вызовет проблемы, чем использование document.write; если у вас больше 25 таких экземпляров, то может быть имеет смысл автоматизировать генерацию элемента.

Другие вопросы по теме