Как добавить обработчик событий с аргументами массиву элементов в JavaScript?

Вы можете добавить последний приз в базу данных, когда вы можете нажать на определенную дату и сэкономить время для предварительного сезона, он может включать логику «Дата последнего выигрыша» + 24 часа.

7
задан Brian Tompsett - 汤莱恩 21 July 2019 в 18:16
поделиться

2 ответа

Ваша цепочка объема закрытия вызывает Ваши проблемы. Путем объявления встроенной функции-обработчика Вы создали закрытие. Очевидно, Вы сделали это для использования в своих интересах цикла.

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

Вы пытаетесь передать и затем использовать "действие" и "dao_id" к Вашему закрытию, но Вы передаете ссылки сюда, не значения. Таким образом, когда Ваши закрытия (обработчики) называют, они используют значение, что ссылка была в последний раз присвоена. В Вашем случае, обработчике Шагов 3.

Правила обзора данных закрытия путают достаточно, но Вы можете также быть смущены тем, что "действие" и "dao_id" все еще живы даже при том, что блок цикла закончил выполняться. Ну, в JavaScript нет такой вещи как область действия блока. После того как Вы объявляете переменную, это доступно, пока конец функции или до не является удаленным. Какой бы ни на первом месте.

Однако необходимо повредить цепочку объема. Вот два способа сделать это:

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

for (var i = 0; i < profile.current + 1; i++) {
    if ($('step_anchor_' + i).innerHTML.empty()) {
        var action = profile.steps[i].action;
        var dao_id = profile.steps[i].dao_id;

        $('step_anchor_' + i).innerHTML = profile.steps[i].anchor;
        $('step_anchor_' + i).observe('click', function(a, b){
                return function(){pm.loadData(a, b, true)};
        }(action, dao_id));

        Effect.Appear('step_anchor_' + i, {
                duration: 1,
                delay: (down_delay++)
        });
    }
}

Или это:

function createHandler(action, dao_id) {
    return function(){pm.loadData(action, dao_id, true);};
} 

/* snip - inside some other function */
for (var i = 0; i < profile.current + 1; i++) {
    if ($('step_anchor_' + i).innerHTML.empty()) {
        var action = profile.steps[i].action;
        var dao_id = profile.steps[i].dao_id;

        $('step_anchor_' + i).innerHTML = profile.steps[i].anchor;
        $('step_anchor_' + i).observe('click', createHandler(action, dao_id));
        Effect.Appear('step_anchor_' + i, {
                duration: 1,
                delay: (down_delay++)
        });
    }
}
7
ответ дан 7 December 2019 в 07:52
поделиться

Во-первых, помните свой объем выполнения в событии щелчка. Это ключевое слово в том контексте относится к нажимаемому элементу. Есть ли какой-либо способ, которым можно определить dao_id от элемента, на который нажимают?

0
ответ дан 7 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: