Отсутствует ( после списка аргументов, когда элемент forEach добавляется в атрибут setAttribute onClick

#javascript #html #foreach #attributes

#язык JavaScript #HTML #инструкция foreach #атрибуты

Вопрос:

Я пытаюсь установить атрибут onclick, запускающий функцию, и передать параметры в этой функции. Некоторые параметры поступают непосредственно из элемента моего массива, в котором я создаю кнопку, в которой я хочу создать новый атрибут по щелчку. Как только я использую атрибут элемента (например, element.startTime), я получаю ошибку «Неперехваченная синтаксическая ошибка: отсутствует ) после списка аргументов».

Что я делаю не так?

Вот мой код :

 if(days[day]) {  days[day].forEach(  (element) =gt; {  var scheduleChild = document.createElement('div')  scheduleChild.className = 'btn btn-link text-center schedulesTime'  var address = document.createAttribute("data-address")  address.value = element.address  scheduleChild.setAttributeNode(address)  var startTime = document.createAttribute("data-startTime")  startTime.value = element.startTime  scheduleChild.setAttributeNode(startTime)  var endTime = document.createAttribute("data-endTime")  endTime.value = element.endTime  scheduleChild.setAttributeNode(endTime)  scheduleChild.innerText = element.startTime '-' element.endTime  scheduleChild.setAttribute('onClick','bookTimeslot(' id_provider ',' element.startTime ')')  dayParent.appendChild(scheduleChild)   }  )}  

Создание кнопки работает, и я вижу атрибут onclick, установленный в моей кнопке. Вот, например, HTML-код кнопки, которую я создаю :

 lt;div class="btn btn-link text-center schedulesTime" data-address="3" data-starttime="09:00" data-endtime="09:45" onclick="bookTimeslot(3,09:00)"gt;09:00-09:45lt;/divgt;  

Ответ №1:

Не пытайтесь создавать такие строки кода. Вместо этого назначьте фактическую функцию (или, еще лучше, используйте addEventListener ):

 scheduleChild.addEventListener("click", () =gt; bookTimeslot(id_provider, element.startTime));  

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

Примечание: При этом будет использоваться значение по element.startTime состоянию на момент щелчка. Если возможно, что элемент может измениться, и вы хотите использовать предыдущее значение, возьмите его локально:

 const startTime = new Date( element.startTime); // If it's a `Date` scheduleChild.addEventListener("click", () =gt; bookTimeslot(id_provider, startTime));  

Примечание: Вам не нужно создавать узлы атрибутов напрямую, вы можете использовать setAttribute . Так что это:

 var address = document.createAttribute("data-address") address.value = element.address scheduleChild.setAttributeNode(address)  

становится

 scheduleChild.setAttribute("data-address", element.address);  

Примечание 2: Вы используете функцию со стрелкой, поэтому очевидно, что вы находитесь в среде ES2015 . var фактически устарел, в общем, я рекомендую let или const .

С этими изменениями:

 days[day].forEach(  (element) =gt; {  const scheduleChild = document.createElement("div");  scheduleChild.className = "btn btn-link text-center schedulesTime";  scheduleChild.setAttribute("data-address", element.address);  scheduleChild.setAttribute("data-startTime", element.startTime); // You might want to do the Date-to-string conversion intentionally here rather than relying on the default  scheduleChild.setAttribute("data-endTime", element.endTime); // (same)  scheduleChild.innerText = element.startTime   "-"   element.endTime;// (same)   scheduleChild.addEventListener("click", () =gt; bookTimeslot(id_provider, element.startTime));   dayParent.appendChild(scheduleChild);  } )};  

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

1. Ладно, я не знал, что лучше всего использовать прослушиватель событий. Спасибо

Ответ №2:

Ошибка связана со значением startTime, так как оно содержит : , поэтому вы должны поместить его в «». Нравится:

 scheduleChild.setAttribute('onClick','bookTimeslot(' id_provider ',"' element.startTime '")')