Created
May 11, 2012 05:57
-
-
Save loddit/2657813 to your computer and use it in GitHub Desktop.
![更新了 csrf 检查] 对几个属性进行了包装 data-method(用于a标签可以POST,和模拟DELETE,PUT) data-disable-with(按钮点下后设置disable) data-remote(发起ajax请求)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| jQuery(function ($) { | |
| var csrf_token = $('meta[name=csrf-token]').attr('content'), | |
| csrf_param = $('meta[name=csrf-param]').attr('content'); | |
| $.fn.extend({ | |
| triggerAndReturn: function (name, data) { | |
| var event = new $.Event(name); | |
| this.trigger(event, data); | |
| return event.result !== false; | |
| }, | |
| /** | |
| * Handles execution of remote calls firing overridable events along the way | |
| */ | |
| callRemote: function () { | |
| var el = this, | |
| method = el.attr('method') || el.attr('data-method') || 'GET', | |
| url = el.attr('action') || el.attr('href'), | |
| dataType = el.attr('data-type') || 'script'; | |
| if (url === undefined) { | |
| throw "No URL specified for remote call (action or href must be present)."; | |
| } else { | |
| if (el.triggerAndReturn('ajax:before')) { | |
| var data = el.is('form') ? el.serializeArray() : []; | |
| $.ajax({ | |
| url: url, | |
| data: data, | |
| dataType: dataType, | |
| type: method.toUpperCase(), | |
| beforeSend: function (xhr) { | |
| el.trigger('ajax:loading', xhr); | |
| }, | |
| success: function (data, status, xhr) { | |
| el.trigger('ajax:success', [data, status, xhr]); | |
| }, | |
| complete: function (xhr) { | |
| el.trigger('ajax:complete', xhr); | |
| }, | |
| error: function (xhr, status, error) { | |
| el.trigger('ajax:failure', [xhr, status, error]); | |
| } | |
| }); | |
| } | |
| el.trigger('ajax:after'); | |
| } | |
| } | |
| }); | |
| /** | |
| * confirmation handler | |
| */ | |
| $('a[data-confirm],input[data-confirm]').on('click', function () { | |
| var el = $(this); | |
| if (el.triggerAndReturn('confirm')) { | |
| if (!confirm(el.attr('data-confirm'))) { | |
| return false; | |
| } | |
| } | |
| }); | |
| /** | |
| * remote handlers | |
| */ | |
| $('form[data-remote]').on('submit', function (e) { | |
| $(this).callRemote(); | |
| e.preventDefault(); | |
| }); | |
| $('a[data-remote],input[data-remote]').on('click', function (e) { | |
| $(this).callRemote(); | |
| e.preventDefault(); | |
| }); | |
| $('a[data-method]:not([data-remote])').on('click', function (e){ | |
| var link = $(this), | |
| href = link.attr('href'), | |
| method = link.attr('data-method'), | |
| form = $('<form method="post" action="'+href+'"></form>'), | |
| metadata_input = '<input name="_method" value="'+method+'" type="hidden" />'; | |
| if (csrf_param != null && csrf_token != null) { | |
| metadata_input += '<input name="'+csrf_param+'" value="'+csrf_token+'" type="hidden" />'; | |
| } | |
| form.hide() | |
| .append(metadata_input) | |
| .appendTo('body'); | |
| e.preventDefault(); | |
| form.submit(); | |
| }); | |
| /** | |
| * disable-with handlers | |
| */ | |
| var disable_with_input_selector = 'input[data-disable-with]'; | |
| var disable_with_form_remote_selector = 'form[data-remote]:has(' + disable_with_input_selector + ')'; | |
| var disable_with_form_not_remote_selector = 'form:not([data-remote]):has(' + disable_with_input_selector + ')'; | |
| var disable_with_input_function = function () { | |
| $(this).find(disable_with_input_selector).each(function () { | |
| var input = $(this); | |
| input.data('enable-with', input.val()) | |
| .attr('value', input.attr('data-disable-with')) | |
| .attr('disabled', 'disabled'); | |
| }); | |
| }; | |
| $(disable_with_form_remote_selector).on('ajax:before', disable_with_input_function); | |
| $(disable_with_form_not_remote_selector).on('submit', disable_with_input_function); | |
| $(disable_with_form_remote_selector).on('ajax:complete', function () { | |
| $(this).find(disable_with_input_selector).each(function () { | |
| var input = $(this); | |
| input.removeAttr('disabled') | |
| .val(input.data('enable-with')); | |
| }); | |
| }); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment