Javascript按数据属性中的函数名称回调

时间:2015-09-28 15:38:12

标签: javascript jquery

我正在尝试为ajax调用提供回调函数,其中函数名称保存在" data-apply"表格的属性。

jQuery(function($) {
    $('form[data-async]').on('submit', function(event) {
        var $form = $(this);
        var $target = $($form.attr('data-target'));
        var apply = $form.attr('data-apply');
        $.ajax({
            type: $form.attr('method'),
            url: $form.attr('action'),
            data: $form.serialize(),

            success: function(data, status) {
                var callBackFunc = new Function(apply);
                callBackFunc.call();
            }
        });

        event.preventDefault();
    });
});

function addBubble(){
    alert('a');
}

表格:

<form id="111" class="form-horizontal " data-async data-target="#rating-modal" data-apply="addBubble();"  action="/some/action/performed" method="POST">

我希望避免在这种情况下使用eval(),因为eval()可能会引入安全性和性能问题。不确定Function()是一种更安全的方法,还是有一种完全不同的方法可以解决这个问题。

那么无论如何都要传递函数回调以处理差异情况?

原始代码来自:https://gist.github.com/havvg/3226804

2 个答案:

答案 0 :(得分:10)

由于函数是全局定义的,因此可以通过window对象调用它。

window["functionName"].call();

从addBubble

中删除括号
<form id="111" class="form-horizontal " data-async data-target="#rating-modal" data-apply="addBubble"  action="/some/action/performed" method="POST">

的Javascript

jQuery(function($) {
    $('form[data-async]').on('submit', function(event) {
        var $form = $(this);
        var $target = $($form.attr('data-target'));
        var apply = $form.attr('data-apply');
        $.ajax({
            type: $form.attr('method'),
            url: $form.attr('action'),
            data: $form.serialize(),

            success: function(data, status) {
                if(typeof window[apply] == "function")
                    window[apply].call(); //window[apply](); or window[apply].apply(); will work too
            }
        });

        event.preventDefault();
    });
});

function addBubble(){
    alert('a');
}

答案 1 :(得分:5)

如果函数是全局定义的(即在window对象上),则可以使用window[$form.attr('data-apply')]()来调用回调。请注意,您必须删除()

中的data-apply