Jquery сначала связывает событие, затем генерирует dom, события привязки могут быть успешными? [Дубликат]

Вопрос был:

Как вернуть ответ от асинхронного вызова?

, который может быть интерпретирован как:

Как сделать синхронный асинхронный код синхронным?

Решение будет состоять в том, чтобы избежать обратных вызовов и использовать комбинацию Promises и async / await.

Я хотел бы привести пример для запроса Ajax.

(Хотя он может быть записан в Javascript, я предпочитаю писать его на Python и компилировать его в Javascript, используя Transcrypt . Это будет достаточно ясно.)

Позволяет сначала включить использование JQuery, чтобы $ был доступен как S:

__pragma__ ('alias', 'S', '$')

Определить функцию, которая возвращает Promise, в этом случае вызов Ajax:

def read(url: str):
    deferred = S.Deferred()
    S.ajax({'type': "POST", 'url': url, 'data': { },
        'success': lambda d: deferred.resolve(d),
        'error': lambda e: deferred.reject(e)
    })
    return deferred.promise()

Использовать асинхронный код, как если бы он был синхронным:

async def readALot():
    try:
        result1 = await read("url_1")
        result2 = await read("url_2")
    except Exception:
        console.warn("Reading a lot failed")

15
задан Jeremy Holovacs 2 July 2012 в 16:19
поделиться

4 ответа

Оба режима все еще поддерживаются.

Следующий вызов bind():

$(".foo").bind("click", function() {
    // ...
});

Может быть непосредственно преобразован в следующий вызов on():

$(".foo").on("click", function() {
    // ...
});

И следующий вызов delegate():

$("#ancestor").delegate(".foo", "click", function() {
    // ...
});

Может быть преобразован в следующий вызов on():

$("#ancestor").on("click", ".foo", function() {
    // ...
});

Для полноты , следующий вызов live():

$(".foo").live("click", function() {
    // ...
});

Может быть преобразован в следующий вызов on():

$(document).on("click", ".foo", function() {
    // ...
});
35
ответ дан Frédéric Hamidi 5 September 2018 в 08:26
поделиться

.delegate() и .bind() использует метод on. И .click() является ярлыком для .on() тоже.

2
ответ дан antyrat 5 September 2018 в 08:26
поделиться

Метод on может заменить как bind, так и delegate в зависимости от того, как он используется (а также click, поскольку bind может заменить это):

.click(handler) == .on('click', handler)

.bind('click', handler) ==  .on('click', handler)

.delegate('click', '#id', handler) == .on('click', '#id', handler)

Ни click, delegate или bind до сих пор перешли на устаревшую страницу . Я сомневаюсь, что метод click когда-либо будет.

4
ответ дан Guffa 5 September 2018 в 08:26
поделиться

Вы можете вывести использование псевдонимов из исходного кода.

console.log($.fn.delegate);
function (a, b, c, d) {
    return this.on(b, a, c, d);
}

console.log($.fn.bind);
function (a, b, c) {
    return this.on(a, null, b, c);
}

Документация также содержит примеры использования:

$(elements).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(elements).on(events, selector, data, handler);        // jQuery 1.7+
2
ответ дан Rob W 5 September 2018 в 08:26
поделиться
Другие вопросы по тегам:

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