Front End

22 set, 2011

Botão dropdown no jQuery

Publicidade

Introdução

Na
documentação jQueryUI para o  widget .button(), temos um exemplo que
ilustra a funcionalidade de divisão do botão. Veja aqui.

O problema é que o exemplo não está finalizado e,
ao clicar no pequeno botão, somente um alerta será acionado.

Meus requisitos

Eu tinha poucos requisitos, mas eles eram muito
importantes para mim:

  • O dropdown deve se integrar
    perfeitamente ao tema selecionado
  • Somente o pequeno botão ‘+’
    deve interagir com o dropdown
  • Considere ambos os botões
    como um único bloco, de modo que o dropdown apareça somente abaixo deste
    bloco e não somente abaixo do botão ‘+’
  • Todos os botões devem ser
    capazes de ser escondidos e mostrados sob demanda para refletir diferentes
    modos de visualização

Limitações e trabalho a ser feito

Reutilização
de código

No momento, eu não tenho tempo para fazer disso um
widget do JQueryUI, mas com certeza ele seria melhor de manusear. De qualquer maneira,
o que eu fiz foi escrever tudo isso dentro de um controle de usuário (ASP.ne
ASCX) e reutilizar em toda página de edição de item. Para fazer isso, apenas
crie um novo ASCX e coloque todo o código que está no final deste post (CSS,
HTML e Javascript) e já está pronto.

Instâncias múltiplas na página

Uma limitação real é que somente pode existir
uma destas por página.

Portanto, se você precisa deste comportamento mais
de uma vez na página, você deve abstraí-lo dentro de um widget JQuery UI.

Finalizando

O código que estou postando aqui irá renderizar
como a imagem acima e se comporta assim:

  • Clique em ‘+’: Toggles
    abre/fecha o menu dropdown
  • Clique em item dropdown: Fecha o
    dropdown e executa uma ação
  • Mouse deixa o dropdown: Fecha o
    dropdown

O código

Coloque
todo o código abaixo em uma página e isto fará funcionar. Depois
disso, tudo que você tem que fazer é substituir os callbacks de cliques de
eventos:

ItemActionButtons.onSaveClick = function(){ alert('Save button have been clicked'); };

Nós também podemos mostrar/esconder um botão
desta maneira:

ItemActionButtons.AllowCancel(false);

Veja o objeto ItemActionButtons
para mais informações. Sinta-se à vontade para adicionar suas próprias ações e eventos para customizá-lo da
maneira que você precisar.

HTML

<div class="ItemActionButtons"><div class="buttonset" style="float: right;"><input id="btnDelete" value="Delete" class="button" onclick="ItemActionButtons.onDeleteClick.apply(this)" type="button">
<input id="btnCancel" value="Cancel" class="button" onclick="ItemActionButtons.onCancelClick.apply(this)" type="button">
</div><div id="divSaveButton" class="buttonset" style="float: right;"><input id="btnSave" value="Save" class="button" onclick="ItemActionButtons.onSaveClick.apply(this)" type="button">
<input id="btnSaveExtra" class="button" value="+" onclick="ItemActionButtons.onSaveExtraClick.apply(this)" type="button">

<ul class="SaveExtraOptions ui-corner-bottom" id="btnSaveExtraOptions"><li onclick="$('#btnSaveExtraOptions').toggle(); ItemActionButtons.SaveAndNewClick.apply(this)">Save and New</li>
<li onclick="$('#btnSaveExtraOptions').toggle(); ItemActionButtons.SaveAndCopyClick.apply(this)">Save and Copy</li>
</ul></div></div>

CSS

<style type="text/css">

.ItemActionButtons{}
.ItemActionButtons .SaveExtraOptions
{
display: none; list-style-type: none; padding: 5px; margin: 0; border: 1px solid #DCDCDC; background-color: #fff; z-index: 999; position: absolute;
}
.ItemActionButtons .SaveExtraOptions li
{
padding: 5px 3px 5px 3px; margin: 0; width: 150px; border: 1px solid #fff;
}
.ItemActionButtons .SaveExtraOptions li:hover
{
cursor: pointer;
background-color: #DCDCDC;
}
.ItemActionButtons .SaveExtraOptions li a
{
text-transform: none;
}
</style>

Javascript

<script type="text/javascript">

$(document).delegate('#btnSaveExtra', 'mouseleave', function () { setTimeout(function(){ if (!ItemActionButtons.isHoverMenu) { $('#btnSaveExtraOptions').hide(); }}, 100, 1) });
$(document).delegate('#btnSaveExtraOptions', 'mouseenter', function () { ItemActionButtons.isHoverMenu = true; });
$(document).delegate('#btnSaveExtraOptions', 'mouseleave', function () { $('#btnSaveExtraOptions').hide(); ItemActionButtons.isHoverMenu = false; });

var $IsHoverExtraOptionsFlag = 0;
$(document).ready(function () {
$(".button").button();
$(".buttonset").buttonset();

$('#btnSaveExtra').button({ icons: { primary: "ui-icon-plusthick" } });
$('#btnSaveExtraOptions li').addClass('ui-corner-all ui-widget');
$('#btnSaveExtraOptions li').hover(
function () { $(this).addClass('ui-state-default'); },
function () { $(this).removeClass('ui-state-default'); }
);
$('#btnSaveExtraOptions li').mousedown(function () { $(this).addClass('ui-state-active'); });
$('#btnSaveExtraOptions li').mouseup(function () { $(this).removeClass('ui-state-active'); });
});

var ItemActionButtons = {
isHoverMenu: false,

AllowDelete: function (value) { value ? $("#btnDelete").show() : $("#btnDelete").hide() },
AllowCancel: function (value) { value ? $("#btnCancel").show() : $("#btnCancel").hide() },
AllowSave: function (value) { value ? $("#btnSave").show() : $("#btnSave").hide() },
AllowSaveExtra: function (value) { value ? $("#btnSaveExtra").show() : $("#btnSaveExtra").hide() },

onDeleteClick: function () { },
onCancelClick: function () { },
onSaveClick: function () { },
onSaveExtraClick: function () {
$('#btnSaveExtraOptions').toggle();

var btnLeft = $('#divSaveButton').offset().left;
var btnTop = $('#divSaveButton').offset().top + $('#divSaveButton').outerHeight(); // +$('#divSaveButton').css('padding');
var btnWidth = $('#divSaveButton').outerWidth();
$('#btnSaveExtraOptions').css('left', btnLeft).css('top', btnTop);
},
SaveAndNewClick: function () { },
SaveAndCopyClick: function () { }
}

</script>

?

Texto original disponível em http://www.instanceofanobject.com/2011/07/jquery-button-dropdown.html