我正在尝试为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()
是一种更安全的方法,还是有一种完全不同的方法可以解决这个问题。
那么无论如何都要传递函数回调以处理差异情况?
答案 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