2009-06-09 3 views
65

Я работаю над динамическим созданием Javascript, который будет вставлен на веб-страницу по мере ее создания.Как я могу назвать динамический метод в Javascript?

Javascript будет использоваться для заполнения списка на основе выбора в другом списке. Когда выбор одного списка изменяется, он вызывается именем метода на основе выбранного значения списка.

Например:

ListBox1 содержит:

Цвета
Формы

Если выбран 'цвета', то он будет вызывать метод "populate_Colours", заполняющий другой ListBox.
Чтобы уточнить мой вопрос: как мне сделать этот вызов «populate_Colours» в Javascript?

+0

Я d рекомендовать против этого в пользу наличия локальных ветвей в одном методе «заполнения». Это сделало бы его более поддающимся проверке и выглядело бы менее «взломанным» –

+0

см. Мой ответ здесь. [позвонить по имени в javascript] (https://stackoverflow.com/a/46090820/7771019) –

ответ

142

Предполагая, что метод populate_Colours находится в глобальном пространстве имен, вы можете использовать следующий код, который использует оба свойства объекта, к которым можно получить доступ, как если бы объект был ассоциативным массивом и что все глобальные объекты на самом деле являются свойствами объекта-хозяина window.

var method_name = "Colours"; 
var method_prefix = "populate_"; 

// Call function: 
window[method_prefix + method_name](arg1, arg2); 
+6

Спасибо за ответ. Бит «окно» действительно бросил меня, пока я не поймал его в Google, и обнаружил, что глобальные объекты являются частью объекта окна. Теперь это имеет смысл! Спасибо. FYI Я нашел хорошую страницу об этом здесь http://devlicio.us/blogs/sergio_pereira/archive/2009/02/09/javascript-5-ways-to-call-a-function.aspx –

+0

Рад это помог! Вы должны принять этот ответ, если он сработал для вас. – Triptych

+0

Я сделал что-то подобное, за исключением того, что функции, которые я настраивал, были в пространстве имен jQuery «fn». Например, '$ .fn [method_prefix + method_name] (arg1, arg2);' – codecraig

27

Как указывает Триптих, вы можете вызвать любую глобальную функцию сферы, найдя ее в содержимом хост-объекта.

уборщик метод, который загрязняет глобальное пространство имен намного меньше, чтобы явно поместить функции в массив непосредственно следующим образом:

var dyn_functions = []; 
dyn_functions['populate_Colours'] = function (arg1, arg2) { 
       // function body 
      }; 
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
       // function body 
      }; 
// calling one of the functions 
var result = dyn_functions['populate_Shapes'](1, 2); 
// this works as well due to the similarity between arrays and objects 
var result2 = dyn_functions.populate_Shapes(1, 2); 

Этот массив также может быть собственностью какого-либо объекта, кроме глобальной хост-объект также означает, что вы можете эффективно создать собственное пространство имен так, как многие JS-библиотеки, такие как jQuery. Это полезно для уменьшения конфликтов, если/когда вы включаете несколько отдельных библиотек утилиты на одну и ту же страницу и (в других частях вашего разрешения) может упростить повторное использование кода на других страницах.

Вы также можете использовать объект, как так, что вы могли бы найти более чистый:

var dyn_functions = {}; 
dyn_functions.populate_Colours = function (arg1, arg2) { 
       // function body 
      }; 
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
       // function body 
      }; 
// calling one of the functions 
var result = dyn_functions.populate_Shapes(1, 2); 
// this works as well due to the similarity between arrays and objects 
var result2 = dyn_functions['populate_Shapes'](1, 2); 

Обратите внимание, что с массивом или объектом, вы можете использовать либо метод установки или доступа к функциям, а может Конечно, там хранятся и другие объекты. Вы можете дополнительно уменьшить синтаксис любого метода для Contant, который не то, что synamic с помощью JS буквального обозначения следующим образом:

var dyn_functions = { 
      populate_Colours:function (arg1, arg2) { 
       // function body 
      }; 
     , populate_Shapes:function (arg1, arg2) { 
       // function body 
      }; 
}; 

Edit: конечно, для больших блоков функциональности можно расширить выше к очень распространенным «шаблон модуля», который является популярным способом инкапсуляции функций кода организованным образом.

+0

Это хороший способ держать его в чистоте. Как я могу назвать метод? Будет ли работать окно [dyn_functions ['populate_Colours'] (arg1, arg2)? –

+0

Отвечая на мой вопрос - я только что протестировал окно [dyn_functions ['populate_Colours'] (arg1, arg2)]; , и он действительно работает. –

+1

вам не понадобится окно – epascarello

1

Привет попробовать это,

var callback_function = new Function(functionName); 
callback_function(); 

он будет обрабатывать сам параметров.

+0

Непонятная эталонная ошибка - functionName не задано – brianlmerritt

+0

@brianlmerritt вы должны определить значение для 'functionName' ... ответчик сделал предположение, что вы уже определили это. – GoldBishop

7

вы можете сделать это следующим образом:

function MyClass() { 
    this.abc = function() { 
     alert("abc"); 
    } 
} 

var myObject = new MyClass(); 
myObject["abc"](); 
1

для простого яваскрипта функции, мы можем потребительных

var function_name='additionFunction'; 
var argMap={"name":"yogesh"}; 
var argArray=[{"name":"yogesh"}]; 

window[function_name](argMap); 

или

window[function_name](argArray); 

или

window[function_name](argMap,argArray); 

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

-1

Попробуйте с этим:

var fn_name = "Colours", 
fn = eval("populate_"+fn_name); 
fn(args1,argsN); 
+0

Каковы последствия использования этого шаблона? Я читал, что функция 'eval' имеет некоторые сверхъестественные побочные эффекты, связанные с ее использованием. Я вообще стараюсь держаться подальше от него, если это не последнее средство. – GoldBishop

3

Я бы порекомендовал НЕ использовать global/window/eval для этой цели.
Вместо этого, сделать это таким образом:

определить все методы, свойства Handler:

var Handler={}; 

Handler.application_run = function (name) { 
console.log(name) 
} 

Теперь называют его, как этот

var somefunc = "application_run"; 
Handler[somefunc]('jerry'); 

Выход: канистру

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