Получение значения выбора (выпадающего списка) перед изменением
Я хочу добиться того, чтобы каждый раз, когда менялся выпадающий список <select>
, я хотел, чтобы значение выпадающего списка было изменено. Я использую версию jQuery версии 1.3.2 и использую событие change, но значение, которое я получаю, остается после изменения.
<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 (т.е. когда я меняю ее в стек), я хочу, чтобы она имела предыдущее значение, то есть мое ожидаемое в этом случае.
Как этого достичь?
Изменить: В моем случае у меня есть несколько полей выбора на одной странице и хочу, чтобы ко всем из них применялась одна и та же вещь. Также все мои выбранные вставляются после загрузки страницы через ajax.
Ответы
Ответ 1
Объедините событие фокусировки с событием изменения, чтобы достичь желаемого:
(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
Ответ 2
пожалуйста, не используйте для этого глобальный 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());
});
});
только что увидел, что у вас много избранных на странице - этот подход также будет работать для вас, поскольку для каждого выбора вы сохраните превентивное значение для данных выбранного
Ответ 3
Я иду на решение 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
})
Ответ 4
Отслеживание значения вручную.
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;
});
});
Ответ 5
$("#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());
});
Ответ 6
Я использую событие "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
});
Ответ 7
Как использовать пользовательское событие jQuery с интерфейсом типа просмотра angular,
// 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
});
Ответ 8
сохраните текущее выбранное значение выпадающего списка с выбранным jquery в глобальной переменной, прежде чем записывать функцию действия "сменить".
Если вы хотите установить предыдущее значение в функции, вы можете использовать глобальную переменную.
//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;
}
});
});
Ответ 9
Я знаю, что это старый поток, но я подумал, что могу добавить немного больше. В моем случае я хотел передать текст, val и некоторые другие данные 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() в элемент. в противном случае, когда вы пытаетесь отменить значения, которые вы в конечном итоге втягиваете в новую копию выбора, а не предыдущую. Использование метода clone() сохраняет копию выбранного вместо экземпляра.
Ответ 10
Хорошо, почему бы вам не сохранить текущее выбранное значение, и когда выбранный элемент будет изменен, вы сохраните старое значение? (и вы можете обновить его по своему усмотрению)
Ответ 11
Используйте следующий код, я проверил его и его работу
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;
}
});
Ответ 12
(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();
})();
Ответ 13
Я хотел бы внести еще один вариант для решения этой проблемы; поскольку предложенные выше решения не разрешили мой сценарий.
(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. (Добавьте слушателя в тело, проверьте, была ли исходная цель выбрана, выполнить функцию,...).
Подключив прослушиватель изменений к телу, вы можете в значительной степени убедиться, что это будет срабатывать после определенных прослушивателей для выбора, иначе значение "data-previous" будет перезаписано, прежде чем вы сможете даже прочитать его.
Это, конечно, предполагает, что вы предпочитаете использовать отдельные прослушиватели для своего установленного предыдущего и контрольного значения. Это соответствует правильному шаблону с одной ответственностью.
Примечание.. Это добавляет эту "предыдущую" функциональность к всем, поэтому не забудьте точно настроить селектор, если это необходимо.
Ответ 14
Это улучшение в ответе @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() );
}
);
})();
Ответ 15
Лучшее решение:
$('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);
});
Ответ 16
Есть несколько способов достичь желаемого результата, это мой скромный способ сделать это:
Пусть элемент содержит свое предыдущее значение, поэтому добавьте атрибут "previousValue".
<select id="mySelect" previousValue=""></select>
После инициализации "previousValue" теперь можно использовать в качестве атрибута. В JS для доступа к предыдущему значению этого выберите:
$("#mySelect").change(function() {console.log($(this).attr('previousValue'));.....; $(this).attr('previousValue', this.value);}
После того, как вы закончили использовать 'previousValue', обновите атрибут до текущего значения.
Ответ 17
Мне нужно было показать другой div в зависимости от выбора
Вот как вы можете сделать это с помощью синтаксиса jquery и es6
HTML
<select class="reveal">
<option disabled selected value>Select option</option>
<option value="value1" data-target="#target-1" >Option 1</option>
<option value="value2" data-target="#target-2" >Option 2</option>
</select>
<div id="target-1" style="display: none">
option 1
</div>
<div id="target-2" style="display: none">
option 2
</div>
JS
$('select.reveal').each((i, element)=>{
//create reference variable
let $option = $('option:selected', element)
$(element).on('change', event => {
//get the current select element
let selector = event.currentTarget
//hide previously selected target
if(typeof $option.data('target') !== 'undefined'){
$($option.data('target')).hide()
}
//set new target id
$option = $('option:selected', selector)
//show new target
if(typeof $option.data('target') !== 'undefined'){
$($option.data('target')).show()
}
})
})