2015-06-08 4 views
0

Я уверен, что это неправильно, и теперь я застрял. Что я хочу сделать, так это передать функцию в качестве функции обратного вызова другой функции.Передача функции обратного вызова в объектах параметров с другой функцией

Моя функция:

function myfunc(options, callback) { 
var settings = { 
    opt1 = "something", 
    url = "someURL" 
} 
if(options){ 
    $.extend(settings, options); 
} 
$.ajax({ 
    url: settings.url, 
    success: function(data) { 
    callback(); 
    } 
}); 
} 

И HTML, который обеспечивает параметры:

<input type="button" id="btn" value="Click me" data-callback="callbackFN" /> 

Клик событие:

$("#btn").click(function() { 
myfunc({ 
    opt1: "text", 
    url: "theURL" 
}, $(this).data("callback")); 
}); 

К сожалению, обратный вызов всегда передается в виде простой строки и а не как вызываемая функция. Я знаю, это звучит как вопрос новичков, но я застрял на этом. Пожалуйста помоги.

+0

То, что вы возвращаете, является строкой, а не функцией или переменной, сохраняющей эту функцию. –

ответ

3

$(this).data("callback") возвращает строку. Вы хотите найти фактическую функцию, идентифицированную строкой, возвращаемой $(this).data("callback").

Если функция глобальна, вы можете сделать window[$(this).data("callback")], чтобы обратиться к window.callbackFN.

Если функция не является глобальной (то есть, она является локальной для функции), вы можете обратиться к ней с помощью eval, но это может открыть большие проблемы безопасности в вашем коде. Например, рассмотрите data-callback="alert(document.cookie)".

Если вы хотите, чтобы избежать как глобальные обратных вызовов и eval, другой вариант может быть, чтобы поместить обратные вызовы внутри объекта, а не в глобальной области видимости:

var myCallbacks = { 
    callbackFN: function() { ... }, 
    otherCallback: function() { ... } 
} 

Обратитесь к ним с myCallbacks[$(this).data("callback")].

+0

window.callbackFN делает трюк. Большое спасибо. –