2012-05-16 2 views
1

У меня есть объект, который определяет имя и параметры функции, вызываемой в событии click элемента страницы.Функция вызова, определенная в объекте

object_array = [ 
    { 
     id: "id1", 
     onclick: "load_file(filename.php);", 
    }, 

    { 
     id: "id2", 
     onclick: "open_url('http://url.com');", 
    } 
]; 

Эта информация должна быть восстановлена ​​динамически. Я бы хотел, чтобы в событии click вызывается функция onclick для заданного объекта в массиве.

$('element').click(function() { 
     // call object.onclick 
}); 

Похоже, что eval() не является хорошим выбором. Есть ли другой способ вызова этой функции?

+1

Так 'object_array' извлекается с сервера в формате JSON или подобном? Или это просто буквальный встроенный в ваш код? –

+0

Он встроен в код. – user823527

+0

У вас есть контроль над объектами в 'object_array'? Другими словами, можете ли вы изменить формат 'onclick' на что-то разумное? –

ответ

2

Вы должны реорганизовать object_array к:

[{ 
    id: "id1", 
    action: "load_file", 
    url: "filename.php" 
}, { 
    id: "id2", 
    action: "open_url", 
    url: 'http://url.com' 
}]; 

Тогда вы можете назвать его :

var actions = { 
    load_file: function(url) { 
     ... 
    }, 
    open_url: function(url) { 
     ... 
    }, 
    ... 
}; 
object_array.forEach(function(ob) { 
    $("#"+ob.id).click(function() { 
     actions[ob.action](ob.url); 
    }); 
}); 

Если у вас более сложные аргументы, вы также можете доставить массив аргументов вместо url и использовать функцию apply().


Или, если вы просто хотите подстановки-таблицу функций, использование:

var object = { 
    "id1": function() { 
     load_file('filename.php'); 
    }, 
    "id2": function() { 
     open_url('http://url.com'); 
    } 
}; 
$('element').click(function() { 
    object[this.id](); 
}); 
+0

Для меня достаточно справочной таблицы функций. Это было хорошим решением для меня. – user823527

0

вы можете объявить функцию как

onclick : function() 
{ 
    action(arguments); 
} 
2

Вот рабочий jsfiddle: http://jsfiddle.net/Zh6Fv/1/

Как так:

object_array = [ 
     { 
      id: "id1", 
      // Encapsulate in an anonymous function 
      onclick: function(){ load_file('filename.php'); }, 
     }, 
     { 
      id: "id2", 
      // Encapsulate in an anonymous function 
      onclick: function(){ open_url('http://url.com'); }, 
     } 
    ]; 

Тогда на самом деле связать его это так ::

$('element').click(obj.onclick); 

Предположительно вы будете использовать его как это ::

object_array.forEach(function(obj){ 
    // Note there is no need to wrap the obj.onclick 
    // into another anonymous function anymore! 
    $("#" + obj.id).click(obj.onclick); 
}); 

Вот рабочий jsfiddle: http://jsfiddle.net/Zh6Fv/1/

+0

Если бы я должен был вызвать onclick внутри другой функции, это будет 'function name() {object.onclick; } '? Благодарю. – user823527

+0

, если вы хотите его называть, вы называете его 'function name() {object.onclick(); } 'так же, как и вы, нормальная функция! :) – AlanFoster

+0

Мой массив объектов не понравился анонимной функции внутри объекта. Это не понравилось 'onclick: function() {load_file ('filename.php');},'. – user823527

Смежные вопросы