Получение значения 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.
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