Как сделать подстановку переменной JS для exportTableToCSV? - PullRequest
0 голосов
/ 24 января 2019

На моей веб-странице я хочу иметь возможность экспортировать несколько таблиц в формате CSV. Я могу кодировать их индивидуально (например, this ), но цикл for не работает.

// this works
$("#xx001").on('click', function (event) { exportTableToCSV.apply(this, [$('#table001'), 'export.csv']);  });
$("#xx002").on('click', function (event) { exportTableToCSV.apply(this, [$('#table002'), 'export.csv']);  });

// this fails
let myxx = "";
let mytable  = "";
for (let i = 0; i < 5; i++) {
    myxx += "xx00" + i ;
    table += "table00" + i ;
    $('#'+${myxx}).on('click', function (event) { exportTableToCSV.apply(this, [$(  '#'+${table}    ), 'export.csv']); });
});

Я ожидал, что обе таблицы могут быть экспортированы, но я получаю сообщение об ошибке «Файл не найден» с помощью цикла.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Для этого не нужно создавать цикл.Один оператор jQuery может привязать слушателя к каждой кнопке.

$('.btn').on('click', function (event)...

Хитрость в том, что apply() требуется id соответствующей таблицы.Это может быть обеспечено динамически путем обхода DOM относительно конкретной нажатой кнопки.

Если за элементом таблицы следует кнопка (как в связанном примере), тогда нам нужно только сослаться напредыдущий элемент:

$('.btn').on('click', function (event) { exportTableToCSV.apply(this, [$(this).prev().attr("id"), 'export.csv']) 
});

Обратите внимание, что prev() может принимать аргументы селектора, поэтому, даже если таблица не является непосредственно предшествующим родственным элементом, вы можете использовать селектор, чтобы найти что-то вроде prev("table")

0 голосов
/ 24 января 2019

Ваша функция внутри цикла будет вызывать эти последние myxx и table, которые оба равны 005 во время события запуска (когда цикл повторяется до конца, и эти две переменные заполняются с помощьюпоследнее значение цикла).

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

Вам нужно передать ей правильную переменную, вот так:

for (let i = 0; i < 5; i++) {
    let myxx = "xx00" + i ;
    let table = "table00" + i ;

    (function( x, t ) {

        $('#' + x ).on('click', function (event) { exportTableToCSV.apply(this, [$( '#' + t  ), 'export.csv']); });

    })( myxx, table );

};

приведенный выше коддолжен сделать работу за вас.

...