передача значений в функцию не работает, когда внутри цикла for - PullRequest
0 голосов
/ 14 апреля 2020

Я сопоставляю валюты из файла json и отображаю сопоставленные валюты для компонента. У меня есть файл. php, подобный этому

<div class="currency-switch-container" id="currency_container">
    <span style="font-size:12px;font-weight:bold">All currencies</span>
    <div id="currency-map" style="margin-top:15px"></div>
</div>

Я указываю div в вышеупомянутом компоненте в моем файле js следующим образом

let currencyMap = jQuery("#currency-map");

И когда мой jQuery документ готов, я делаю следующее

jQuery(document).ready(function($) {
  $.getJSON('wp-content/themes/mundana/currency/currency.json', function(data) {
    for(let c in data){
      currencyMap.append(`<span onclick="onCurrencyClick(${data[c].abbreviation})"
      class="currency-item">
        <span>
           ${data[c].symbol}
        </span>
        <span>
          ${data[c].currency}
        </span>
      </span>`)
    }
});

}

и моя функция выглядит следующим образом

function onCurrencyClick(val){
  console.log("val",val);
  setCookie("booking_currency", val, 14);
}

Здесь эта функция не работает. Но если я не передаю что-либо функции, она работает так, как будто я вижу журнал в терминале.

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Вместо использования встроенного onclick используйте делегирование события . Это означает, что у вас есть один прослушиватель событий, который обрабатывает все события от детей и внуков. Модификация очень незначительна, см. Приведенный ниже пример.

Причина для этого заключается в том, что вы храните ваш JavaScript в вашем файле JS. Как и сейчас, вы сталкиваетесь с ошибкой JS и должны искать ее в своем HTML. Это может стать очень запутанным. Кроме того, встроенные onclick слушатели действительны, они устарели и их следует избегать, если нет абсолютно никакого другого пути. Сравните это с использованием !important в CSS, то же самое для этого.

function onCurrencyClick(event){
  var val = $(this).val();
  setCookie("booking_currency", val, 14);
}

currencyMap.on('click', '.currency-item', onCurrencyClick);

В этом примере берется val, который вы пытаетесь вставить из атрибута value из нажатой .current-item , <span> элементы не имеют такого атрибута, но <button> имеет и является гораздо более подходящим элементом, поскольку он ожидает взаимодействия с ним. Как правило, рекомендуется использовать интерактивные элементы для таких целей, как нажатие.

В приведенном ниже примере вы видите используемую кнопку и вывод значения abbreviation в атрибуте value элемента <button>, который можно прочитать из функции onCurrencyClick.

jQuery(document).ready(function($) {
  $.getJSON('wp-content/themes/mundana/currency/currency.json', function(data) {
    for(let c in data){
      currencyMap.append(`
        <button value="${data[c].abbreviation}" class="currency-item">
          <span>
            ${data[c].symbol}
          </span>
          <span>
            ${data[c].currency}
          </span>
        </button>
      `)
    }
});
1 голос
/ 14 апреля 2020

Привет, ваше выражение $ {data [c] .abbreviation} поместит значение в строку функции без строковых кавычек, т. Е. Результирующий будет onCurrencyClick(abbreviation), тогда как должен быть onCurrencyClick('abbreviation'). используйте взамен onclick = "onCurrencyClick ('$ {data [c] .abbreviation}')".

0 голосов
/ 14 апреля 2020

onclick не будет работать для динамически добавляемого тега div

Yo должен следовать за jQuery on событием

См .: jQuery on Переполнение стека См .: Dynami c HTML Элементы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...