2010-05-05 2 views
1

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

только с одной парой select/id это прекрасно работает, но у меня есть кратность, и единственное, что меняется, это идентификатор выбора и ввода. Фактически только окончание изменений, все входы начинаются с featredproductid и все идентификаторы select начинаются с recipesproduct, а затем оба заканчиваются категорией.

Я знаю, что перечисление этого снова и снова для каждой категории - это не способ сделать это. Я думаю, мне нужно создать массив категорий var cats = ['olive oil', "grains", "pasta"] , а затем использовать функцию forEach? может быть?

здесь неуклюжим код

window.addEvent('domready', function() { 
    $('recipesproductoliveoil').addEvent('change', function(e){ 
     pidselected = this.options[this.selectedIndex].getProperty('value') ; 
    $("featuredproductidoliveoil").setProperties({ 
     value: pidselected}); ; 
    }); 
     $('recipesproductgrains').addEvent('change', function(e){ 
      pidselected = this.options[this.selectedIndex].getProperty('value') ; 
     $("featuredproductidgrains").setProperties({ 
      value: pidselected}); ; 
     }); 
     $('recipesproductpasta').addEvent('change', function(e){ 
      pidselected = this.options[this.selectedIndex].getProperty('value') ; 
     $("featuredproductidpasta").setProperties({ 
      value: pidselected}); ; 
     }); 
    $('recipesproductpantry').addEvent('change', function(e){ 
     pidselected = this.options[this.selectedIndex].getProperty('value') ; 
    $("featuredproductidpantry").setProperties({ 
     value: pidselected}); ; 
    }); 

}); 

иметь в виду, что это MooTools 1.1 (нет, я не могу обновить его жаль). Я уверен, что это своего рода базовый, что-то, что, кажется, обволакивает мой мозг. но я совершенно уверен, что делает это, как указано выше, не очень хорошо ...

+0

JS поддерживает функции более высокого порядка (функции, которые принимают и возвращают функции). Обратите внимание, что ответы на все следуют общей схеме: откорректируйте часть функции, а не меняйте ее, превратив ее в параметр функции более высокого порядка. – outis

+0

Вы должны объявить 'pidselected' как локальный (' var pidselected' внутри слушателя), чтобы вы не использовали глобальное и не загрязняли глобальное пространство имен. – outis

ответ

1

Вы близки. Так вы можете это сделать:

var cats = ['oliveoil', 'grains', 'pasta']; 
for (i in cats) { 
    addChangeFunction(cats[i]); 
} 

function addChangeFunction(name) { 
    $('recipesproduct' + name).addEvent('change', function(e) { 
     pidselected = this.options[this.selectedIndex].getProperty('value'); 
     $('featuredproductid' + name).setProperties({ 
      value: pidselected 
     }); 
    }); 
} 
+0

почему ограничение основано на id? гораздо более семантический подход заключается в том, чтобы перейти к нему с помощью селектора и работать с массивом, например 'var addChangeEvent (elements) {elements.each (function (el) {el.addEvent (...)') либо добавить класс = «еда» для них или «addChangeEvent» ($ («formid»). getElements («select»)); '. В 1.2 вы можете применить событие непосредственно к селектору a'la' $ ("formid"), .getElements ("select"). addEvent() '' –

+0

@Dimitar: В Риме действительно есть больше способов. Это один из самых коротких. Не стесняйтесь публиковать свой собственный ответ. – BalusC

+0

спасибо, это то, что я поэтому в этих котах [i] передается функции как имя. right? – liz

0

Нечто подобное могло бы помочь:

function bindSelectFeature(select, featured) { 
    $(select).addEvent('change', function(e){ 
     pidselected = this.options[this.selectedIndex].getProperty('value') ; 
     $(featured).setProperties({ 
      value: pidselected 
     }); 
    }); 
    }); 
    bindSelectFeature('recipesproductpasta','featuredproductidpasta'); 
Смежные вопросы