Присоединение нескольких событий к одной функции в jQuery

0

Я ищу противоположность, которую все искали. У меня есть эта анонимная функция jQuery, которую я хочу сохранить таким образом, но я хочу привязать к ней несколько обработчиков событий на разных событиях (точно два события).

  1. Когда textarea имеет текст внутри, он изменился (keyup)
  2. Когда document клик (click).

Я знаю, что хватаю функцию обратного вызова и помещаю ее в объявление функции, а затем использование функции в обоих случаях будет выполнять задание, но есть ли что-то вокруг, что не потребует, чтобы я включил функцию обратного вызова в обычную функцию и просто оставьте ее как является?

Это код, который у меня есть:

urls.keyup(function(){
    delay('remote', function(){
        if (urls.val().length >= char_start)
        {           
            var has_lbrs = /\r|\n/i.test(urls.val());

            if (has_lbrs)
            {
                urls_array = urls.val().split("\n");

                for (var i = 0; i < urls_array.length; i++)
                {
                    if (!validate_url(urls_array[i]))
                    {
                        urls_array.splice(i, 1);
                        continue;   
                    }
                }
            }
            else
            {
                if (!validate_url(urls.val()))
                {
                    display_alert('You might have inserted an invalid URL.', 'danger', 3000, 'top');
                    return; 
                }
            }

            final_send = (has_lbrs && urls_array.length > 0) ? urls_array : urls.val();

            if (!final_send)
            {
                display_alert('There went something wrong while uploading your images.', 'danger', 3000, 'top');
                return; 
            }

            var template = '<input type="text" class="remote-progress" value="0" />';

            $('.pre-upload').text('').append(template);
            $('.remote-progress').val(0).trigger('change').delay(2000);
            $('.remote-progress').knob({
                'min':0,
                'max': 100,
                'readOnly': true,
                'width': 128,
                'height': 128,
                'fgColor': '#ad3b3b',
                'bgColor': '#e2e2e2',
                'displayInput': false,
                'cursor': true,
                'dynamicDraw': true,
                'thickness': 0.3,
                'tickColorizeValues': true,
            });

            var tmr = self.setInterval(function(){myDelay()}, 50);        
            var m = 0;

            function myDelay(){
                m++;
                $('.remote-progress').val(m).trigger('change');

                if (m == 100) 
                {            
                    // window.clearInterval(tmr);
                    m = 0;
                }
            }

            $.ajax({
                type: 'POST',
                url: 'upload.php',

                data: {
                    upload_type: 'remote',
                    urls: JSON.stringify(final_send),
                    thumbnail_width: $('.options input[checked]').val(),
                    resize_width: $('.options .resize_width').val(),
                    album_id: $('#album_id').val(),
                    usid: $('#usid').val(),
                },

                success: function(data) {
                    // console.log(data); return;
                    var response = $.parseJSON(data);

                    if (response) 
                    {
                        $('.middle').hide();
                        $('.remote-area').hide();
                        window.clearInterval(tmr);
                    }

                    if ('error' in response)
                    {
                        //console.log(response.error);

                        if (!$('.top-alert').is(':visible'))
                        {
                            display_alert(response.error, 'danger', 3000, 'top');
                        }

                        return;
                    }

                    if (!target.is(':visible'))
                    {
                        target.show().addClass('inner');
                    }
                    else
                    {
                        target.addClass('inner');
                    }

                    for (var key in response) 
                    {
                        var image_url = response[key];

                        var thumb_uri = image_url.replace('/i/', '/t/');
                        var forum_uri = '[img]' + image_url + '[/img]';
                        var html_uri  = '&lt;a href=&quot;' + image_url + '&quot;&gt;' + image_url + '&lt;/a&gt;';

                        var view_url  = image_url.replace(/store\/i\/([A-Za-z0-9]+)(?=\.)/i, "image/$1");
                        view_url = strstr(view_url, '.', true);

                        // Append the upload box
                        target.append(upload_box(key));

                        // Hide knob
                        $('.knobber').hide();

                        // Put the image box
                        putImage($('.' + key), view_url, image_url, thumb_uri, forum_uri, html_uri);
                    }
                },
            }); 
        }

    }, 2000); // Delay
}); // Remote upload

Как заставить этот код запускать и click на документ?

Спасибо.

  • 2
    вам нужно поделиться кодом, чтобы мы могли лучше понять
  • 0
    Хорошо, я буду.
Показать ещё 4 комментария
Теги:

1 ответ

2
Лучший ответ

Как вы сами сказали в своем вопросе, ответ заключается в том, чтобы создать внешнюю именованную ссылку на функцию обратного вызова и использовать ее в качестве обратного вызова.

подобно

jQuery(function () {
    function callback(e) {
        console.log('event2', e.type);
    }
    $('input').keyup(callback);
    $(document).click(callback)
})

Но поскольку вы попросили другой стиль взглянуть, он по существу делает то же самое, что и выше

jQuery(function () {
    var callback;
    $('input').keyup(callback = function (e) {
        console.log('event', e.type);
    });
    $(document).click(callback)
})

Демо: скрипка

Ещё вопросы

Сообщество Overcoder
Наверх
Меню