我有一个选择框,我想在将其更改为特定选项之前添加确认。例如:
<select name="select">
<option value="foo" selected="selected">foo</option>
<option value="bar">bar</option>
</select>
$('select').change(function() {
var selected = $(this).val();
if (selected == 'bar') {
if (!confirm('Are you sure?')) {
// set back to previously selected option
}
}
});
我正在考虑添加隐藏的输入字段,并在每次更改选择时更新其值。这样我就可以检索change
函数中的先前值。 Example:
<input type="hidden" name="current" value="foo" />
$('select').change(function() {
var selected = $(this).val();
var current = $('input[name=current]').val();
if (selected == 'bar') {
if (!confirm('Are you sure?')) {
$(this).val(current);
return false;
}
}
$('input[name=current]').val(selected);
});
有没有更容易/更好的方法来实现这一目标?
答案 0 :(得分:77)
您可以使用$.data
功能,而不是使用全局变量(邪恶!)或隐藏元素(滥用DOM):
$('select').change(function() {
var selected = $(this).val();
if (selected == 'bar') {
if (!confirm('Are you sure?')) {
$(this).val($.data(this, 'current'));
return false;
}
}
$.data(this, 'current', $(this).val());
});
答案 1 :(得分:4)
希望这会有所帮助。
$( YOUR_SELECT_ELEMENT ).on({
"ready": function (e) {
$(this).attr("readonly",true);
},
"focus": function (e) {
$(this).data( { choice: $(this).val() } );
},
"change": function (e) {
if ( ! confirm( "Change selected option, proceed?" ) ){
$(this).val( $(this).data('choice') );
return false;
} else {
$(this).attr("readonly",false);
return true;
}
}
});
我不确定&#39;返回false&#39;有效删除属性&#39; readonly&#39;。
答案 2 :(得分:0)
我认为这可能是实现同样的另一种方式。此代码也将撤消选择更改。
<div class="selection">
<input type="radio" class="selected" value="test1" name="test1"
checked="checked" /><label>test1</label>
<input type="radio" name="test1" value="test2" /><label>
test2</label>
<input type="radio" name="test1" value="test3" /><label>
test3</label>
</div>
$("input[name='test1']").change(function() {
var response = confirm("do you want to perform selection change");
if (response) {
var container = $(this).closest("div.selection");
//console.log(container);
//console.log("old sel =>" + $(container).find(".selected").val());
$(container).find(".selected").removeClass("selected");
$(this).addClass("selected");
//console.log($(this).val());
console.log("new sel =>" + $(container).find(".selected").val());
}
else {
var container = $(this).closest("div.selection");
$(this).prop("checked", false);
$(container).find(".selected").prop("checked", true);
}
});
答案 3 :(得分:0)
$(document).on('change','.change_response_status',function()
{
var responseStatusId = this.id;
var responseID = $("#"+responseStatusId).attr('data-id');
var previouesSatatus = $("#hidden_response_id_"+responseID).val();
var confirmstatus = confirm("Are you sure you want to change status for this item?");
var currentSelectedValue = $(this).val();
if(confirmstatus==true)
{
$("#hidden_response_id_"+responseID).val(currentSelectedValue);
}
else
{
$(this).val(previouesSatatus);
$("#hidden_response_id_"+responseID).val(previouesSatatus);
return false;
}
return false;
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<select data-id="2" id="response_id_2" class="change_response_status" name="status">
<option value="1">Accept</option>
<option value="2" selected="selected">No Respond</option>
<option value="3">Reject</option>
</select>
<input class="hidden_response_class" id="hidden_response_id_2" type="hidden" value="1" name="hidden_response_staus">
这是在确认框上单击cancle时显示已选择选项的最佳方式。
答案 4 :(得分:0)
这是一个更为详细和评论的版本的lonesomeday接受的答案,提示每次更改确认并使用.data()
而不是jQuery.data()
。
它可能会帮助人们更多地理解逻辑。
伴随jsFiddle是here。
// set the initial data value
$(document).ready(function() {
var my_select = $("#my_select");
my_select.data("current", "foo");
});
// when selecting another option
$('select').change(function() {
var $this = $(this);
var selected = $this.val();
logit($this, selected, 1); // log data to screen
// if clicking cancel on the confirm dialog
if (!confirm('Are you sure?')) {
logit($this, selected, 2); // log data to screen
// set the select's value to the stored data value
var previous_data_value = $(this).data("current");
$this.val(previous_data_value);
// escape the onchange function
return false;
}
// if clicking OK, update the data value to the chosen option
logit($this, selected, 3); // log data to screen
$this.data("current", $this.val());
});
// helper functions only below
$(document).on("click", ".clicker", function() {
var my_select = $("#my_select");
alert(my_select.data("current"));
});
function logit($this, selected, instance) {
var current_data_value = $this.data("current");
if (instance === 1) {
var value_log = "<span>you selected the value: " + selected + "</span>";
$(".container_2").append(value_log);
var data_log = "<span>the previous value was: " + current_data_value + "</span>";
$(".container_2").append(data_log);
} else if (instance === 2) {
$(".container_2").append("<span>you clicked Cancel, value was reverted to: " + current_data_value + "</span>");
}
if (instance === 3) {
$(".container_2").append("<span>you clicked OK, value was changed from '" + current_data_value + "' to '" + selected + "'</span>");
}
$(".container_2").append("<span>------------------------------------------------------</span>");
}
&#13;
* {
box-sizing: border-box;
}
select {
width: 200px;
float: left;
}
.clicker {
width: 200px;
float: left;
}
.container_1 {
margin: auto;
width: 400px;
background: lightgray;
padding-top: 10px;
padding-bottom: 10px;
}
.container_1:after {
clear: both;
content: " ";
height: 0;
display: block;
}
.container_2 {
width: 400px;
height: 300px;
overflow-y: auto;
border: 1px solid gray;
padding: 10px;
margin: auto;
background: #222;
}
span {
display: block;
margin-bottom: 5px;
color: lime;
font-family: arial;
font-size: 12px;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container_1">
<select id="my_select">
<option value="foo">foo</option>
<option value="bar">bar</option>
<option value="baz">baz</option>
</select>
<button class="clicker">what's the data value now?</button>
</div>
<div class="container_2">
</div>
&#13;
答案 5 :(得分:0)
如果您使用的是Select2,则可以使用以下内容,
$('select').on('select2:selecting', function() {
if (!confirm('Are you sure you?')) {
$(this).select2('close')
return false
}
})
答案 6 :(得分:-1)
Oldschool方式(在我们使用jquery之前):
<select id="mySelect" onchange="if(confirm('Do you really want to change?')){ doSomething(); } else { this.selectedIndex=myIndex; }">
<option value="foo" selected="selected">foo</option>
<option value="bar">bar</option>
</select>
<script type="text/javascript">
var myIndex = $('mySelect').selectedIndex;
</script>