javascript - para - menu desplegable vertical html
¿Cómo puedo usar la lista<ul> en lugar del menú desplegable<select> para el selector de idiomas? (3)
Uso msDropDown
para convertir la lista <select>
a <ul>
para el selector de idiomas. Pero el problema es que con este complemento jQuery, la selección tarda mucho tiempo en cargarse después de la página cargada.
Entonces, ¿cómo puedo usar una lista ul
lugar de select
?
Este es mi código de selección:
<select name="lang" class="language" onchange="location.href=''index.php?lang=''+this.value+''''.$trackpage.''">
<option name="lang" data-image="style/lang/de.png" value="de">Deutsch</option>
<option name="lang" data-image="style/lang/en.png" value="en" selected="selected">English</option>
<option name="lang" data-image="style/lang/es.png" value="es">Espanol</option>
<option name="lang" data-image="style/lang/fr.png" value="fr">Francais</option>
<option name="lang" data-image="style/lang/it.png" value="it">Italiano</option>
</select>
Intenté con:
<ul onchange="location.href=''index.php?lang=''+this.value+''">
<li>
<a href="" name="lang" data-image="style/lang/de.png" value="de">English</a>
</li>
</ul>
pero el value
y el cambio no son compatibles con ul
y a
.
¿Hay alguna manera de hacer que ul
funcione con los atributos select
?
¡Gracias! ¡Y perdón por mi mal inglés!
Respuesta actualizada 2015
Como esta pregunta todavía se visita con mucha frecuencia y debido a algunas solicitudes en los comentarios, he vuelto a visitar mi código. Aún puedes encontrar mi respuesta original a continuación.
HTML
<button class="language_selector">Choose Language</button>
<ul class="languages">
<li><a href="/en">English</a></li>
<li><a href="/de">Deutsch</a></li>
</ul>
<article>
<h1>More Content</h1>
</article>
JavaScript
var trigger = $(''.language_selector'');
var list = $(''.languages'');
trigger.click(function() {
trigger.toggleClass(''active'');
list.slideToggle(200);
});
// this is optional to close the list while the new page is loading
list.click(function() {
trigger.click();
});
CSS
.language_selector {
width: 200px;
background: #222;
color: #eee;
line-height: 25px;
font-size: 14px;
padding: 0 10px;
cursor: pointer;
}
.languages {
display: none;
position: absolute;
margin: 0;
background: #dddddd;
}
.languages > li {
width: 200px;
background: #eee;
line-height: 25px;
font-size: 14px;
padding: 0 10px;
cursor: pointer;
}
.languages > li:hover {
background: #aaa;
}
Manifestación
Respuesta original de 2013
Lo haría así:
var nav = $(''#nav'');
var selection = $(''.select'');
var select = selection.find(''li'');
nav.click(function(event) {
if (nav.hasClass(''active'')) {
nav.removeClass(''active'');
selection.stop().slideUp(200);
} else {
nav.addClass(''active'');
selection.stop().slideDown(200);
}
event.preventDefault();
});
select.click(function(event) {
// updated code to select the current language
select.removeClass(''active'');
$(this).addClass(''active'');
alert ("location.href = ''index.php?lang=" + $(this).attr(''data-value''));
});
h2 {
width: 200px;
background: #222;
color: #eee;
line-height: 25px;
font-size: 14px;
padding: 0 10px;
cursor: pointer;
}
ol.select {
display: none;
}
ol.select > li {
width: 200px;
background: #eee;
line-height: 25px;
font-size: 14px;
padding: 0 10px;
cursor: pointer;
}
ol.select > li:hover {
background: #aaa;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h2 id="nav">Choose Language</h2>
<ol class="select">
<li data-value="en">English</li>
<li data-value="de">Deutsch</li>
</ol>
Este agrega una clase el elemento seleccionado. Esto funciona, si permaneces en esa misma página después de seleccionar y no utilizas location.href
.
No puede usar los atributos de selección, en su lugar puede crear sus propios atributos y usarlos en el elemento <ul>
Tal vez esto te ayude
Primero el código html
<div id="language">Change Lang</div>
<ul id="lang">
<li>
<a href="" name="lang" data-val="de">
<img src="http://icons.iconarchive.com/icons/famfamfam/flag/16/ad-icon.png"/>
English</a></li>
<li>
<a href="" name="lang" data-val="he">
<img src="http://icons.iconarchive.com/icons/famfamfam/flag/16/il-icon.png"/>
Hebrew</a></li>
</ul>
Siguiente el código jquery
$("#language").click(function(){
$("#lang li").slideToggle();
});
$("#lang li").click(function() {
var url = location.href = "index.php?lang=" + $(this).find(''a'').attr("data-val");
location.href =url;
});
lo hice sin el complemento.
Preste atención a que creé un atributo de data-val
para almacenar el lenguaje deseado. y obtengo este atributo usando el código jquery
Una muy simple (ul para seleccionar la transformación de jquery desplegable) sin necesidad de cambiar html, muy útil para los menús móviles:
$(function(){
var close = function() {
$("ul").each(function() {
var $thisUl = $(this);
if($thisUl.find("li > a.click").length == 0) {
var $li = $(document.createElement(''li'')).append($(document.createElement(''a'')).attr({
"class": "click selectable visible",
"href": "#"
}).text("Select"));
$thisUl.append($li);
}
else {
$thisUl.find("li > a.click").addClass("visible");
}
$thisUl.find("li:has(> a:not(.click))").hide();
$thisUl.find("li > a.click").show();
});
};
var sentinel = function() {
$("ul").each(function(){
var $thisUl = $(this);
$($thisUl).find("li > a").click(function(event){
if($(event.target).is(''ul li a.visible'')) {
event.preventDefault();
$thisUl.find("li:has(> a:not(.click))").show();
$thisUl.find("li > a.selectable").hide();
$thisUl.find("li > a.click").removeClass("visible");
}
else {
$thisUl.find("li").each(function(){
$(this).find("a").removeClass("click selectable visible");
$(this).find("a.selectable").remove();
});
$(this).addClass("click visible");
close();
}
});
});
};
var reconnaissance = function() {
$(document).click(function(event) {
if(!$(event.target).is(''ul li a'')) {
close();
}
});
};
close();
sentinel();
reconnaissance();
});
ul {
width: auto;
margin: 2px auto;
background-color: #ddd;
border-top: 1px solid #999;
border-bottom: 3px solid #999;
border-left: 1px solid #999;
border-right: 1px solid #999;
border-radius: 8px;
list-style:none;
background-size: 16px 16px;
background-repeat: no-repeat;
background-attachment: scroll;
background-position: left 2px;
background-color: transparent;
cursor: pointer;
}
li > a.click {
color: darkgreen;
font-weight: bold;
}
li a {
color:darkblue;
text-decoration:none;
}
li a:active, li a:hover {
color:darkred;
background-color: lightyellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
<li><a href="#">Option 1</a></li>
<li><a class="click" href="#">Option 2</a></li>
<li><a href="#">Option 3</a></li>
</ul>
<ul>
<li><a href="#">Option 1</a></li>
<li><a href="#">Option 2</a></li>
<li><a href="#">Option 3</a></li>
</ul>