Pergunta

Tenho um pequeno problema para descobrir por que meu evento personalizado não dispara e funciona corretamente ... Meu evento personalizado deve ser anexado a cada coluna, como posso fazer com que o controle deslizante seja vinculado a apenas uma coluna (colsobjeto abaixo)?Com meu código atual, se eu clicar em qualquer coluna, todas as colunas serão redimensionadas ...

Estou tentando redimensionar dinamicamente uma coluna da tabela usando um controle deslizante que abre dentro de uma pequena div, se uma tabela for clicada, minha pequena caixa de diálogo é carregada para obter toda a largura da coluna atual e adicionar um manipulador de eventos, meu código é:

//param: data = current table
function DisplayColumnData(data) {

    var cols = $(data).find("col");

   //attach slider to each col
    $(cols).each(function(i) {

            var that = this;

            var coldata = $("<div class='ui-col-data' />"); 
            var colvalue = $("<span class='ui-col-value' />");
                colvalue.text($(that).attr("width"));

            coldata.text(" >col" + i + ": ").append(colvalue);

            $(".ui-resizer-cols").append(coldata);

            //handle column resizing, bind each col to the slider...
            $(coldata).click(function() {
                $(".ui-col-data").unbind("resizehandler");
                //remove all other binded events then trigger the new event only...
                $(coldata).trigger("resizehandler", that);
            });

    });

}

$(".ui-col-data").live("resizehandler", function(event, data) {
    var $parent = $(this).closest(".ui-resizer-cols");

    //remove classes from all other cols so only the clicked col is resized
    $parent.find(".ui-col-data").removeClass("ui-col-border");
    $parent.find(".ui-col-value").removeClass("ui-resizer-val");

    $(this).addClass("ui-col-border"); //now the active col   

    var valfield = $(this).find("span.ui-col-value");
    valfield.addClass("ui-resizer-val");


    //update whatever...
    $("#ui-resizer").slider('value', valfield.text() );
    $("#ui-resizer").bind("slide", function(e, ui) {
        valfield.text(ui.value);
        $(data).attr("width", ui.value); //update col
    });

});

TABELA:

<table>
<colgroup>
      <col width="25%">
      <col width="25%">
      <col width="25%">
      <col width="25%">
</colgroup>
<tbody>
<tr>...</tr>// 4 td's here as normal
<tr>...</tr>
</tbody>
</table>

Controle deslizante:

<div class="ui-resizer-content">
        <div id="ui-resizer" class="ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all">
        <div class="ui-slider-range ui-slider-range-max ui-widget-header" style="width: 100%;"></div><a href="#" class="ui-slider-handle ui-state-default ui-corner-all" style="left: 0%;"></a></div>
        <div class="ui-resizer-cols"></div>

           <p> <a href="#" id="lnkResizer" style="float: right;">close</a>
        </p>
    </div>
Foi útil?

Solução

Isso não estava tão claro (pelo menos para mim) na documentação, mas a correção é:

 $("#ui-resizer").slider({
                    slide: function(e, ui) {
                        valfield.text(ui.value + "%");
                        $(column).attr("width", ui.value); //update col
                    }
                });

Aparentemente, o código que usei (abaixo) é global para todos os controles deslizantes usando um único manipulador, e a correção acima é específica para uma instância de um controle deslizante?(se eu entendi corretamente)

$("#ui-resizer").bind("slide", function(e, ui) { ... }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top