Изображение отслеживания маяка с функцией 204 ответа и обратного вызова

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

Я легко могу заставить это работать, но мне нужно иметь возможность вызывать функцию обратного вызова впоследствии.

Следующее, кажется, никогда не будет уволено, когда 204 возвращается.

    beacon: function (opts) {
        var beacon = new Image();

        opts = $.extend(true, {}, {
            url: pum_vars.ajaxurl || null,
            data: {
                action: 'pum_analytics',
                _cache: (+(new Date()))
            },
            error: function () {
                console.log('error');
            },
            success: function () {
                console.log('success');
            }
        }, opts);

        // Create a beacon if a url is provided
        if (opts.url) {
            // Attach the event handlers to the image object
            if (beacon.onerror) {
                beacon.onerror = opts.error;
            }

            if (beacon.onload) {
                beacon.onload = opts.success;
            }

            $(beacon).on('load', function( response, status, xhr ){
                alert(status);
            });

            // Attach the src for the script call
            beacon.src = opts.url + '?' + $.param(opts.data);
        }
    }

Отслеживание зарегистрировано должным образом, но нет предупреждений или сообщений журнала консоли. Это возможно или я просто трачу свое время?

Редактировать ------

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

    beacon: function (opts) {
        var beacon = new Image();

        opts = $.extend(true, {}, {
            url: pum_vars.ajaxurl || null,
            data: {
                action: 'pum_analytics',
                _cache: (+(new Date()))
            },
            callback: function () {
                console.log('tracked');
            }
        }, opts);

        // Create a beacon if a url is provided
        if (opts.url) {
            // Attach the event handlers to the image object
            $(beacon).on('error success done', opts.callback);

            // Attach the src for the script call
            beacon.src = opts.url + '?' + $.param(opts.data);
        }
    }

1 ответ

Решение

Вы не прикрепляете никаких обратных вызовов к изображению. Ваш тест if (beacon.onerror) приводит к ложному, потому что beacon.onerror является null,

Вы должны использовать if( "onerror" in beacon ) чтобы проверить, beacon имеет onerror имущество.

Но почему бы вам не использовать метод jquery on?

$(beacon).on("error", function() {
    alert("Jquery error");
});

$(beacon).on("done", function() {
    alert("Jquery done");
});
Другие вопросы по тегам