Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   динамические списки (https://javascript.ru/forum/jquery/6675-dinamicheskie-spiski.html)

Shaci 14.12.2009 15:03

динамические списки
 
Здрасти всем, суть такая:
На сайте http://plugins.jquery.com есть плагин динамичских селектов
(http://plugins.jquery.com/project/De...SelectbySilVeR)..
Я решил на основе примера, и не влезая во внутреннсти плагина, написать что-то подобное (дабы потренировать себя в jquery и javascript)

В примере:

<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.dependent.js"></script>

<script type="text/javascript">
jQuery(function($){				
	$('#selectme2').dependent({ parent:'selectme', group: 'selectable' });
	$('#selectme3').dependent({ parent:'selectme2', group: 'selectable' });	
});
</script>

<select name="selectme" id="selectme" class="selectable">
	<option value="">-- select --</option>
	<option value="1" title="flowers"  >Flowers</option>
    <option value="2" title="animals"  >Animals</option>
</select>

<select name="selectme2" id="selectme2" class="selectable">
	<option value="">-- select --</option>
	<option value="1" class="flowers" title="sunflower"  >Sunflower</option>
    <option value="2" class="flowers" title="rose" 		 >Rose</option>
    <option value="3" class="animals" title="dog"		 >Dog</option>
    <option value="4" class="animals" title="cat"		 >Cat</option>
</select>

<select name="selectme3" id="selectme3" class="selectable">
    <option value="">-- select --</option>
    <option value="1" class="sunflower">Sunflower type 1</option>
    <option value="2" class="sunflower">Sunflower type 2</option>
    <option value="3" class="sunflower">Sunflower type 3</option>
    <option value="4" class="rose">Rose type 1</option>
    <option value="5" class="rose">Rose type 2</option>
    <option value="6" class="rose">Rose type 3</option>
    <option value="7" class="dog">Dog type 1</option>
    <option value="8" class="dog">Dog type 2</option>
    <option value="9" class="dog">Dog type 3</option>
    <option value="10" class="cat">Cat type 1</option>
    <option value="11" class="cat">Cat type 2</option>
    <option value="12" class="cat">Cat type 3</option>
</select>


Я его чуть переработал, и написал свой маленький плагин:

<script type="text/javascript" src="jquery-1.3.2.js"></script>
<script type="text/javascript" src="jquery.depend_1.js"></script>
<script type="text/javascript">
jQuery(function($){
	$('#selectme2').depend({ parent:'selectme'});
	$('#selectme3').depend({ parent:'selectme2'});
});
</script>

<select name="selectme" id="selectme" class="selectable clasamea">
    <option value="">-- select --</option>
    <option value="1" title="flowers">Flowers</option>
    <option value="2" title="animals">Animals</option>
</select>

<select name="selectme2" id="selectme2" class="selectable">
    <option value="">-- select --</option>
    <option value="1" class="flowers" title="sunflower">Sunflower</option>
    <option value="2" class="flowers" title="rose">Rose</option>
    <option value="3" class="animals" title="dog">Dog</option>
    <option value="4" class="animals" title="cat">Cat</option>
</select>

<select name="selectme3" id="selectme3" class="selectable">
    <option value="">-- select --</option>
    <option value="1" class="sunflower">Sunflower type 1</option>
    <option value="2" class="sunflower">Sunflower type 2</option>
    <option value="3" class="sunflower">Sunflower type 3</option>
    <option value="4" class="rose">Rose type 1</option>
    <option value="5" class="rose">Rose type 2</option>
    <option value="6" class="rose">Rose type 3</option>
    <option value="7" class="dog">Dog type 1</option>
    <option value="8" class="dog">Dog type 2</option>
    <option value="9" class="dog">Dog type 3</option>
    <option value="10" class="cat">Cat type 1</option>
    <option value="11" class="cat">Cat type 2</option>
    <option value="12" class="cat">Cat type 3</option>
</select>


все тоже, только строчку чуть сократил:
<script type="text/javascript">
jQuery(function($){
$('#selectme2').depend({ parent:'selectme'});
$('#selectme3').depend({ parent:'selectme2'});
});
</script>

А это плагин jquery.depend_1.js:
(function($) {
$.fn.depend = function(options) {
this.find('option').hide();
this.find('option:first').show();
var current = this;
$('#' + options.parent).find('option:first').each(function(){
     $(this).click(function(){
        current.find('option:not(:first)').hide();
        current.find('option:first').attr({selected:'selected'});
        current.find('option:first').click();
     })
})
 $('#' + options.parent).find('option:not(:first)').each(function(){
    var cur = $(this);
    $(this).click(function(){
        current.find('option:not(:first)').hide();
        var text = cur.text().toLowerCase();
        current.find('option' + '.' + text).show();
        current.find('option:first').attr({selected:'selected'});
        current.find('option:first').click();
    })
 })
}
})(jQuery);


Он не работает в IE из-за того, что в эксплорере незя скрыть option,
можно скрыть только весь select (и в Опере тоже не пашет, в чем там причина - не знаю), но в FF работает.

Вообщем,решил я его попробовать переделать так, чтобы он под IE заработал, и вместо скрытия отдельных option,
попробовал создавать скрытые копии каждого select,
и по необходимости кидать из них нужные option в исходные select (из которых предварительно выкинуты все option кроме первого)

(function($) {
$.fn.depend = function(options) {
    var child = this.clone().attr('id',(this.attr('id') + 'hid')).hide();//для потомка создаем скрытые копии, из которых потом будем вынимать ( и засовывать обратно) options
    this.after(child);//прикрепляем невидимку после каждого 'двойника'    
    this.find('option:not(:first)').remove();//удаляем из потомка все option кроме первого
if(!($('*').is('#' + $('#' + options.parent).attr('id') + 'hid'))) {//если у родителя нет скрытого поля => это первый родитель (исходный), добавляем обработчики событий для него
//для его option
var current = this;//в переменной - потомок-замыкание
$('#' + options.parent).find('option:first').each(function(){//при щелчке на первом option родителя (в данном случае первого родителя)
     $(this).click(function(){//при щелчке
        child.append(current.find('option:not(:first)'));//к клону потомка прикрепляем всё, что было в элементе потомке
        current.find('option:first').click();
     })
})//при щелчке на других option
$('#' + options.parent).find('option:not(:first)').each(function(){
    var cur = $(this);//текущий option-closure (замыкание)
    $(this).click(function(){
        child.append(current.find('option:not(:first)'));//выкидываем из потомка все option, кроме первого в потомок-клон
        var text = cur.text().toLowerCase();//текст option, по которому щелкнули        
        current.append(child.find('option' + '.' + text));
        current.find('option:first').click();
    })
})
}
else {
var current = this;//в переменной - потомок-замыкание
$('#' + options.parent).find('option:first').each(function(){//при щелчке на первом option родителя (в данном случае первого родителя)
     $(this).click(function(){//при щелчке
        child.append(current.find('option:not(:first)'));//к клону потомка прикрепляем всё, что было в элементе потомке
        current.find('option:first').click();
     })
})//при щелчке на других option
$('#' + options.parent + 'hid').find('option:not(:first)').each(function(){
    var cur = $(this);//текущий option-closure (замыкание)
    $(this).click(function(){
        child.append(current.find('option:not(:first)'));//выкидываем из потомка все option, кроме первого в потомок-клон
        var text = cur.text().toLowerCase();//текст option, по которому щелкнули
        current.append(child.find('option' + '.' + text));
        current.find('option:first').click();
    })
})
}
}
})(jQuery);


Но почему-то опять в IE не работает, только в FF
В чем может быть причина?


Часовой пояс GMT +3, время: 21:14.