"use strict"; // найдём на странице все элементы класса `.c80_callback_show_popup` // и добавим поведение при клике: // - кнопка должна перейти в состояние "in progress" и стать некликабельной // - на сервер уходит запрос за popup формой // также содержит "метод" removeInProgressState, который переводит все `.c80_callback_show_popup` в "нормальное" состояние function CallbackDecorator() { var css_selector = '.c80_callback_show_popup'; var url = '/callback_popup'; var $links; var _mark_req_in_progress = false; //-[ public ]----------------------------------------------------------------------------------------------------------------------- //-[ private ]----------------------------------------------------------------------------------------------------------------------- var _progress_state_add = function ($link) { console.log('<_progress_state_add>'); $link.addClass('c80_callback_progress'); }; // у кнопок `.c80_callback_show_popup` уберём in_progress state var _progress_state_remove = function () { setTimeout(function () { $links.removeClass('c80_callback_progress'); }, 500); }; var _req = function () { $.ajax({ url: url, type: 'POST', dataType: 'script' }).done(function (data, result) { if (result == "success") { // callback_form.js.erb //markWasPasted = true; } _mark_req_in_progress = false; _progress_state_remove(); }) }; var _on_link_click = function (e) { console.log('<_on_link_click>'); e.preventDefault(); if (!_mark_req_in_progress) { _mark_req_in_progress = true; _progress_state_add($(this)); _req(); } }; var _decorateLinks = function () { console.log('<_decorateLinks>'); $links.on('click', _on_link_click); }; //-[ fire ]----------------------------------------------------------------------------------------------------------------------- var _fInit = function () { console.log('<_fInit>'); $links = $(css_selector); _decorateLinks(); }; _fInit(); } $(document).ready(function() { var callbackDecorator = new CallbackDecorator(); });