2013-04-25 4 views
-1

У меня есть объект в пределах объекта, который содержит свойство, значение которого является функцией JQuery:функция JQuery как значение свойства объекта

var fields = { 
    id: {}, 
    timeStarted: {}, 
    duration: {}, 
    status: {}, 
    name: { 
     field: $("#companyName"), 
     changeEvent: $("#companyName").on("click", function(){ 
      alert("bazinga!"); 
     }) 
    } 
}; 

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

function registerChangeEvents(){ 
    $.each(fields, function(field, v){ 
     $.each(v, function(prop, vv){ 
      // check which property the loop is on: if changeEvent 
      if (prop == "changeEvent"){ 
       vv(); 
      } 
     }); 
    }); 
} 

Когда я бегу registerChangeEvents() однако, консоль возвращается Uncaught TypeError: object is not a function. Я могу обернуть значение changeEvent с function(){...}, и это сделает его функцией, которая будет работать нормально. По какой-то причине это не похоже на правильный подход.

Пожалуйста, дайте мне знать, если у вас есть идеи.

Спасибо.

+0

Это не функция, это результат вызова этих функций jQuery (который оказывается объектом оболочки jQuery). Обертка вызова в анонимной функции * - это путь (если вы не хотите использовать '$ .fn.click.bind ($ (" # companyName "), alert.bind (окно," bazinga! "))') – Bergi

ответ

2

Когда у вас есть это:

changeEvent: $("#companyName").on("click", function(){ 
    alert("bazinga!"); 
}) 

Код выполняется сразу и результат .on() является оригинальным, выбранные объекты ... которые просто $("#companyName"). Таким образом, changeEvent установлен в объект jQuery, содержащий элемент с id «companyName».

Я хотел бы изменить name быть:

name: { 
    field: "#companyName", 
    changeEvent: function(){ 
     alert("bazinga!"); 
    } 
} 

, а затем измените функцию, чтобы быть:

function registerChangeEvents(){ 
    $.each(fields, function(prop, v){ 
     var field, changeEvent; 
     $.each(v, function(propp, vv){ 
      if (propp === "field") field = vv; 
      if (propp === "changeEvent") changeEvent = vv; 
     }); 
     if (field && changeEvent) $(field).on("change", changeEvent); 
    }); 
} 

Я путаются 1 вещь - вы называете это "ChangeEvent", но event в вашем первоначальном коде для "click".

+0

Спасибо за ваш ответ. Я предполагаю, что мое первое предложение (обертывание значения changeEvent в функции javascript) было бы лучше всего в этом случае? Кроме того, я прошу прощения за то, что не упоминал об этом раньше, но 'registerChangeEvents()' должен быть запущен после того, как был выполнен определенный вызов ajax. – zeddotes

+0

Различные 'fields' будут иметь разные' changeEvents', которые не ограничиваются только 'click', поэтому я так назвал это. Например, я использую псевдо-радио кнопки Bootstrap, которые не запускают собственное событие изменения. – zeddotes

+0

'registerChangeEvents()' вызывается так, что я могу иметь эти события изменений для всех полей, которые я буду вызывать через Ajax. – zeddotes

1

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

name: { 
    field: $("#companyName"), 
    changeEvent: function() { 
     this.field.on("click", function(){ 
      alert("bazinga!"); 
     }); 
    } 
} 

Затем вызовите его следующим образом:

$.each(fields, function(field, v) { 
    if ($.isFunction(v.changeEvent)) { 
     v.changeEvent(); 
    } 
} 
Смежные вопросы