Pergunta

Eu tenho uma página que exibe uma lista de registros. O usuário pode selecionar o status de registro usando os botões de rádio, g .:

<div id="record_653">
  <label><input type="radio" name="status_653" value="new" checked/>new</label>
  <label><input type="radio" name="status_653" value="skipped" />skipped</label>
  <label><input type="radio" name="status_653" value="downloaded" />downloaded</label>
</div>

Eu estou usando JQuery para enviar as alterações feitas pelo usuário de volta ao servidor, onde eu usá-los para atualizar o banco de dados. Esta é uma versão simplificada do que eu faço:

$("#record_653").click( 
function(event) { 
    var url = ...,        
        params = ...;
    post(url,params);                    
});

O problema é que este código vai criar solicitações mesmo se o usuário clicar no mesmo botão que foi previamente marcada. O que eu realmente quero é o evento "na mudança", a não ser o seu comportamento no Internet Explorer não é muito útil (por exemplo, aqui ).

Então, eu acho que eu de alguma forma tem que identificar se o evento clique alterou o valor.

É o valor velho em algum lugar armazenadas (no DOM? No evento?) Para que eu pudesse comparar com ele?

Se não, como devo guardar o valor antigo?

Foi útil?

Solução

O valor antigo não é armazenado em algum lugar onde você pode consultá-lo, não. Você vai precisar para armazenar o valor a si mesmo. Você poderia usar uma variável javascript, um elemento input oculto ou função data() do jQuery.

Editar

A função data jQuery fornece o acesso a uma estrutura de dados de chave de valor-par como uma maneira de armazenar dados arbitrários para um determinado elemento. Os olhares api como:

 // store original value for an element
 $(selector).data('key', value);

 // retrieve original value for an element
 var value = $(selector).data('key');

Um pensamento mais desenvolvido:

$(document).ready(function() {

    // store original values on document ready
    $(selector).each(function() {
        var value = $(this).val();
        $(this).data('original-value', value);
    })

    // later on, you might attach a click handler to the the option
    // and want to determine if the value has actually changed or not.
    $(selector).click(function() {

        var currentValue = $(this).val();
        var originalValue = $(this).data('original-value');
        if (currentValue != originalValue) {

            // do stuff.

            // you might want to update the original value so future changes
            // can be detected:
            $(this).data('original-value', currentValue);
        }

    });

});

Outras dicas

$('#record_653 input:radio').each(function() {
    $(this).data('isChecked', $(this).is(':checked'));

    $(this).click(function() {
        if ( $(this).is(':checked') !== $(this).data('isChecked') ) {
            // do changed action
        } else {
          $(this).data('isChecked', !$(this).data('isChecked') );
        }
    })

});

Este foi complicado de fazer na minha cabeça, mas eu acho que você quer algo como isto.

Como foi sugerido por meder e Ken Browning , acabei usando dados do jQuery () para armazenar o valor anterior e verificar contra-lo em cada clique.

Armazenar um "estiver marcada" boolean para cada rádio de entrada é uma solução. No entanto, você precisa manter esse valor. Assim, no manipulador de eventos clique, além de alterar o "estiver marcada" da entrada atual, você precisa encontrar a entrada que foi previamente verificada e alterar seus dados "estiver marcada" para falsa.

O que eu escolhi para fazer em vez disso foi à loja, no elemento pai, o objeto atualmente marcada. Então meu código é algo como:

$(document).ready(  
    function()  {
        // find the checked input and store it as "currChecked" for the record
        $("#record_653").data("currChecked", 
                             $(this).find("input:radio:checked")[0]);
        // add the click event
        $("#record_653").click( function(event) {
                 if ($(event.target).is("input:radio") && 
                     event.target !== $(this).data("currChecked")) 
                 {
                    $(this).data("currChecked", event.target);
                    handleChangeEvent(event);
                 }
            });

        });
    }
);

Graças

Eu tive o mesmo problema, mas com FF eu consegui lidar com isso usando o evento onchange em vez do onclick.

Este é exatamente o que eu estava procurando para lidar com IE7. Funciona como um encanto! Obrigado pela solução detalhada!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top