J'ai une liste de tous div avec un ensemble et égale hauteur/largeur qui sont float:left
de sorte qu'ils sont assis côte à côte et se replient si ce parent est plus petit que le combiné avec des éléments.Navigation au clavier haut/bas/gauche/droite avec jQuery?
Assez standard. est de créer une liste des icônes bootstrap twitter, il donne quelque chose comme ceci:
J'ai ajouté la navigation au clavier suivant/précédent en utilisant le code ci-dessous, mais vous remarquerez que les touches fléchées haut/bas sont mappé pour appeler les fonctions gauche/droite. Qu'est-ce que je ne sais pas comment faire est de faire la navigation haut/bas?
(function ($) {
$.widget("ui.iconSelect", {
// default options
options: {
},
$select: null,
$wrapper: null,
$list: null,
$filter: null,
$active: null,
icons: {},
keys: {
left: 37,
up: 38,
right: 39,
down: 40
},
//initialization function
_create: function() {
var that = this;
that.$select = that.element;
that.$wrapper = $('<div class="select-icon" tabindex="0"></div>');
that.$filter = $('<input class="span12" tabindex="-1" placeholder="Filter by class name..."/>').appendTo(that.$wrapper);
that.$list = $('<div class="select-icon-list"></div>').appendTo(that.$wrapper);
//build the list of icons
that.element.find('option').each(function() {
var $option = $(this);
var icon = $option.val();
that.icons[icon] = $('<a data-class="' + icon + '"><i class="icon ' + icon + '"></i></a>');
if ($option.is(':selected')) {
that.icons[icon].addClass('selected active');
}
that.$list.append(that.icons[icon]);
});
that.$wrapper.insertBefore(that.$select);
that.$select.addClass('hide');
that._setupArrowKeysHandler();
that._setupClickHandler();
that._setupFilter();
that.focus('selected');
},
focus: function (type) {
var that = this;
if (that.$active === null || that.$active.length == 0) {
if (type == 'first') {
that.$active = that.$list.find('a:visible:first');
} else if (type == 'last') {
that.$active = that.$list.find('a:visible:last');
} else if (type == 'selected') {
that.$active = that.$list.find('a.selected:visible:first');
that.focus('first');
}
}
that.$active.addClass('active');
var toScroll = ((that.$list.scrollTop() + that.$active.position().top)-that.$list.height()/2)+that.$active.height()/2;
//that.$list.scrollTop((that.$list.scrollTop() + top)-that.$list.height()/2);
that.$list.stop(true).animate({
scrollTop: toScroll,
queue: false,
easing: 'linear'
}, 200);
if (type === 'selected') {
return false;
}
that.$select.val(that.$active.data('class'));
that.$select.trigger('change');
},
_setupArrowKeysHandler: function() {
var that = this;
that.$wrapper.on('keydown', function (e) {
switch (e.which) {
case that.keys.left:
that.moveLeft();
break;
case that.keys.up:
that.moveUp();
break;
case that.keys.right:
that.moveRight();
break;
case that.keys.down:
that.moveDown();
break;
case 16:
return true;
case 9:
return true;
break;
default:
that.$filter.focus();
return true;
}
return false;
});
},
_setupFilter: function(){
var that = this;
that.$filter.on('keydown keyup keypress paste cut change', function(e){
that.filter(that.$filter.val());
});
},
_setupClickHandler: function() {
var that = this;
that.$list.on('click', 'a', function() {
that.$wrapper.focus();
that.$active.removeClass('active');
that.$active = $(this);
that.focus('first');
});
},
moveUp: function() {
var that = this;
return that.moveLeft();
},
moveDown: function() {
var that = this;
return that.moveRight();
},
moveLeft: function() {
var that = this;
that.$active.removeClass('active');
that.$active = that.$active.prevAll(':visible:first');
that.focus('last');
return false;
},
moveRight: function() {
var that = this;
that.$active.removeClass('active');
that.$active = that.$active.nextAll(':visible:first');
that.focus('first');
return false;
},
filter: function(word){
var that = this;
var regexp = new RegExp(word.toLowerCase());
var found = false;
$.each(that.icons, function(i, $v){
found = regexp.test(i);
if(found && !$v.is(':visible')){
$v.show();
} else if(!found && $v.is(':visible')){
$v.hide();
}
});
}
});
})(jQuery);
vous pouvez appeler la fonction gauche/droite aussi souvent que de nombreux éléments sont dans chaque rangée - serait le plus facile sans même jeter un oeil à votre code;) Je vais le faire maintenant ... – luk2302
@ luk2302, Solution possible oui , mais comment comptez-vous combien d'éléments sont dans la rangée? Je suppose que je pourrais faire '$ wrapper.width() mod $ element.width()' mais l'approche globale me semble plutôt hacky. J'ai regardé dans http://www.zehnet.de/2010/11/19/document-elementfrompoint-a-jquery-solution/ mais je ne peux pas savoir comment faire le point par rapport à l'emballage ... – Hailwood
Quel est le problème avec l'utilisation du code que vous avez fourni dans le lien. Si vous collez simplement le code et ajoutez le vôtre, cela devrait fonctionner: vous pouvez obtenir l'élément ci-dessus via '$ .elementFromPoint ($ (ce. $ actif) .offset(). left, $ (that. $ active) .offset() .top-10); Pour le dessous, il faudrait ajouter 10 + la hauteur d'un objet lui-même, mais c'est corrigé. Je ne sais pas comment changer l'attribut actif dans votre code, donc je ne fournis pas de réponse, juste un commentaire. – luk2302