Получение значения select (выпадающего списка) перед изменением



то, что я хочу достичь, когда <select> выпадающий список изменен я хочу, чтобы значение выпадающего списка перед изменением. Я использую версию 1.3.2 jquery и использую событие изменения, но значение, которое я получаю, после изменения.



<select name="test">
<option value="stack">Stack</option>
<option value="overflow">Overflow</option>
<option value="my">My</option>
<option value="question">Question</option>
</select>


допустим, в настоящее время опция My выбрана теперь, когда я изменяю ее на стек в событии onchange (т. е. когда я изменил ее на стек), я хочу, чтобы это было Предыдущее значение, т. е. мое ожидаемое в этом случае.



как этого можно достичь ?



Edit: в моем случае у меня есть несколько полей выбора на одной странице и хочу, чтобы то же самое было применено ко всем из них. Также все мои select вставляются после загрузки страницы через ajax.

607   15  

15 ответов:

объединить фокус событие с изменить событие для достижения того, что вы хотите:

(function () {
    var previous;

    $("select").on('focus', function () {
        // Store the current value on focus and on change
        previous = this.value;
    }).change(function() {
        // Do something with the previous value after the change
        alert(previous);

        // Make sure the previous value is updated
        previous = this.value;
    });
})();

рабочий пример:http://jsfiddle.net/x5PKf/766

пожалуйста, не используйте глобальный var для этого-сохраните значение prev в данных вот пример: http://jsbin.com/uqupu3/2/edit

код для ссылки:

$(document).ready(function(){
  var sel = $("#sel");
  sel.data("prev",sel.val());

  sel.change(function(data){
     var jqThis = $(this);
     alert(jqThis.data("prev"));
     jqThis.data("prev",jqThis.val());
  });
});

просто увидел, что у вас есть много вариантов на странице - этот подход также будет работать для вас, так как для каждого выбора вы будете хранить значение prev на данных select

Я иду на решение Avi Pinto, которое использует jquery.data()

использование фокуса не является допустимым решением. Он работает при первом изменении параметров, но если вы остаетесь на этом элементе выбора и нажимаете клавишу "вверх" или "вниз". Он не будет проходить через фокус-событие снова.

поэтому решение должно быть более похоже на следующее,

//set the pre data, usually needed after you initialize the select element
$('mySelect').data('pre', $(this).val());

$('mySelect').change(function(e){
    var before_change = $(this).data('pre');//get the pre data
    //Do your work here
    $(this).data('pre', $(this).val());//update the pre data
})

отслеживание значения вручную.

var selects = jQuery("select.track_me");

selects.each(function (i, element) {
  var select = jQuery(element);
  var previousValue = select.val();
  select.bind("change", function () {
    var currentValue = select.val();

    // Use currentValue and previousValue
    // ...

    previousValue = currentValue;
  });
});
 $("#dropdownId").on('focus', function () {
    var ddl = $(this);
    ddl.data('previous', ddl.val());
}).on('change', function () {
    var ddl = $(this);
    var previous = ddl.data('previous');
    ddl.data('previous', ddl.val());
});

Я использую событие "live", мое решение в основном похоже на Dimitiar, но вместо использования" focus "мое предыдущее значение сохраняется при срабатывании" click".

var previous = "initial prev value";
$("select").live('click', function () {
        //update previous value
        previous = $(this).val();
    }).change(function() {
        alert(previous); //I have previous value 
    });

Как насчет использования пользовательского события jQuery с интерфейсом типа угловых часов;

// adds a custom jQuery event which gives the previous and current values of an input on change
(function ($) {
    // new event type tl_change
    jQuery.event.special.tl_change = {
        add: function (handleObj) {
            // use mousedown and touchstart so that if you stay focused on the
            // element and keep changing it, it continues to update the prev val
            $(this)
                .on('mousedown.tl_change touchstart.tl_change', handleObj.selector, focusHandler)
                .on('change.tl_change', handleObj.selector, function (e) {
                // use an anonymous funciton here so we have access to the
                // original handle object to call the handler with our args
                var $el = $(this);
                // call our handle function, passing in the event, the previous and current vals
                // override the change event name to our name
                e.type = "tl_change";
                handleObj.handler.apply($el, [e, $el.data('tl-previous-val'), $el.val()]);
            });
        },
        remove: function (handleObj) {
            $(this)
                .off('mousedown.tl_change touchstart.tl_change', handleObj.selector, focusHandler)
                .off('change.tl_change', handleObj.selector)
                .removeData('tl-previous-val');
        }
    };

    // on focus lets set the previous value of the element to a data attr
    function focusHandler(e) {
        var $el = $(this);
        $el.data('tl-previous-val', $el.val());
    }
})(jQuery);

// usage
$('.some-element').on('tl_change', '.delegate-maybe', function (e, prev, current) {
    console.log(e);         // regular event object
    console.log(prev);      // previous value of input (before change)
    console.log(current);   // current value of input (after change)
    console.log(this);      // element
});

сохраните текущее значение выпадающего списка с выбранным jquery в глобальной переменной перед записью функции действия выпадающего списка "on change". Если вы хотите установить Предыдущее значение в функции, вы можете использовать глобальную переменную.

//global variable
var previousValue=$("#dropDownList").val();
$("#dropDownList").change(function () {
BootstrapDialog.confirm(' Are you sure you want to continue?',
  function (result) {
  if (result) {
     return true;
  } else {
      $("#dropDownList").val(previousValue).trigger('chosen:updated');  
     return false;
         }
  });
});

Я знаю, что это старый поток, но подумал, что я могу добавить немного больше. В моем случае я хотел передать текст, Вал и некоторые другие данные attr. В этом случае лучше хранить весь вариант как значение prev, а не только val.

пример кода ниже:

var $sel = $('your select');
$sel.data("prevSel", $sel.clone());
$sel.on('change', function () {
    //grab previous select
    var prevSel = $(this).data("prevSel");

    //do what you want with the previous select
    var prevVal = prevSel.val();
    var prevText = prevSel.text();
    alert("option value - " + prevVal + " option text - " + prevText)

    //reset prev val        
    $(this).data("prevSel", $(this).clone());
});

EDIT:

забыл добавить .clone() на элемент. в противном случае, когда вы пытаетесь вернуть значения, вы в конечном итоге вытаскиваете новую копию select а не Предыдущее. Использование метода clone () сохраняет копию select вместо его экземпляра.

лучшее решение:

$('select').on('selectric-before-change', function (event, element, selectric) {
    var current = element.state.currValue; // index of current value before select a new one
    var selected = element.state.selectedIdx; // index of value that will be selected

    // choose what you need
    console.log(element.items[current].value);
    console.log(element.items[current].text);
    console.log(element.items[current].slug);
});

Ну, почему бы вам не сохранить текущее выбранное значение, и когда выбранный элемент будет изменен, у вас будет сохранено старое значение? (и вы можете обновить его, как вы хотите)

используйте следующий код, я проверил его и его работу

var prev_val;
$('.dropdown').focus(function() {
    prev_val = $(this).val();
}).change(function(){
            $(this).unbind('focus');
            var conf = confirm('Are you sure want to change status ?');

            if(conf == true){
                //your code
            }
            else{
                $(this).val(prev_val);
                $(this).bind('focus');
                return false;
            }
});
(function() {

    var value = $('[name=request_status]').change(function() {
        if (confirm('You are about to update the status of this request, please confirm')) {
            $(this).closest('form').submit(); // submit the form
        }else {
            $(this).val(value); // set the value back
        }
    }).val();
})();

Я хотел бы внести еще один вариант решения этой проблемы; поскольку решения, предложенные выше, не решили мой сценарий.

(function()
    {
      // Initialize the previous-attribute
      var selects = $('select');
      selects.data('previous', selects.val());

      // Listen on the body for changes to selects
      $('body').on('change', 'select',
        function()
        {
          $(this).data('previous', $(this).val());
        }
      );
    }
)();

Это использует jQuery так, что def. это зависимость здесь, но это может быть адаптировано для работы в чистом javascript. (Добавьте прослушиватель в тело, проверьте, была ли исходная цель select, execute function ...).

прикрепив прослушиватель изменений к телу, вы можете быть уверены, что это сработает после конкретные прослушиватели для выбора, в противном случае значение "data-previous" будет перезаписано до того, как вы сможете его прочитать.

это, конечно, предполагая, что вы предпочитаете использовать отдельные слушатели для вашего set-previous и check-value. Это вписывается в шаблон с одной ответственностью.

Примечание: это добавляет такую же функциональность все выбирает, так что не забудьте настроить селекторы, если это необходимо.

это улучшение на @thisisboris ответ. Он добавляет текущее значение к данным, поэтому код может управлять, когда переменная, установленная в текущее значение, изменяется.

(function()
{
    // Initialize the previous-attribute
    var selects = $( 'select' );
    $.each( selects, function( index, myValue ) {
        $( myValue ).data( 'mgc-previous', myValue.value );
        $( myValue ).data( 'mgc-current', myValue.value );  
    });

    // Listen on the body for changes to selects
    $('body').on('change', 'select',
        function()
        {
            alert('I am a body alert');
            $(this).data('mgc-previous', $(this).data( 'mgc-current' ) );
            $(this).data('mgc-current', $(this).val() );
        }
    );
})();

Comments

    Ничего не найдено.