Во-первых, это возможно? Борьба с этим часами; Я думаю, причина, по которой мои события не стреляют, состоит в том, что одно событие - это отключение/переписывание другого. Я хочу связать два события change
с одним и тем же элементом. Как я могу это сделать?Связывание нескольких событий того же типа?
По желанию, вот функция я борюсь с:
(function($) {
$.fn.cascade = function(name, trigger, url) {
var cache = {};
var queue = {};
this.each(function() {
var $input = $(this);
var $trigger = $input.closest('tr').prev('tr').find(trigger);
//$input.hide();
var addOptions = function($select, options) {
$select.append('<option value="">- Select -</option>');
for(var i in options) {
$select.append('<option value="{0}">{1}</option>'.format(options[i][0], options[i][1]));
}
$select.val($input.val()).trigger('change');
}
var $select = $('<select>')
// copy classes
.attr('class', $input.attr('class'))
// update hidden input
.bind('change', function() {
$input.val($(this).val());
})
// save data for chaining
.data('name', name)
.data('trigger', $trigger);
$input.after($select);
$trigger.bind('change', function() {
var value = $(this).val();
$select.empty();
if(value == '' || value == null) {
$select.trigger('change');
return;
}
// TODO: cache should be a jagged multi-dimensional array for nested triggers
if(value in cache) {
addOptions($select, cache[value]);
} else if(value in queue) {
$select.addClass('loading');
queue[value].push($select);
} else {
var getDict = {}
getDict[name] = value;
// TODO: use recursion to chain up more than one level of triggers
if($(this).data('trigger')) {
getDict[$(this).data('name')] = $(this).data('trigger').val();
}
$select.addClass('loading');
queue[value] = [$select];
$.getJSON(url, getDict, function(options) {
cache[value] = options;
while(queue[value].length > 0) {
var $select = queue[value].pop();
$select.removeClass('loading');
addOptions($select, options);
}
});
}
}).trigger('change');
});
return this;
}
})(jQuery);
Соответствующий кусок HTML еще больше ... но, по сути, это выбрать окно с кучей лет, а затем <input>
, который получает (видимо) замену на <select>
, показывающий автомобиль, изготовленный в этом году, а затем еще <input>
, который заменяется на модели для этого года.
На самом деле, похоже, что он работает довольно хорошо, за исключением загрузки на странице. Начальные значения стираются.
решаемые проблемы, потянув, что $select.bind()
немного и сделать его жить:
$('select.province').live('change', function() {
$(this).siblings('input.province').val($(this).val());
});
$('select.make').live('change', function() {
$(this).siblings('input.make').val($(this).val());
});
$('select.model').live('change', function() {
$(this).siblings('input.model').val($(this).val());
});
Отстой, что это жестко закодировано там для моих индивидуальных случаев, хотя. В идеале я хотел бы инкапсулировать всю логику этой функции. Так что я могу просто получить
$('input.province').cascade('country', 'select.country', '/get-provinces.json');
$('input.make').cascade('year', 'select.year', '/get-makes.json');
$('input.model').cascade('make', 'select.make', '/get-models.json');
Вы должны иметь возможность иметь два события 'change' на одном и том же элементе (вот тест: http://jsfiddle.net/fdCRW/). Хотите поделиться своим кодом? –
Согласитесь с Gert G - размещение кода здесь поможет нам лучше определить вашу проблему. – JasCav
@ Джейсон: это около 70 строк, и включает в себя некоторые призывы ajax, которые вы не сможете запустить (тестирование на localhost). Тем не менее ... я могу опубликовать его. – mpen