这是使用 .on 的最新解决方案
$('#form-id').on('focus','select',function(){
 var previous = $(this).children('option').filter(':selected').val();
});
但是对于我想要实现的目标,上面的内容太松散了,我需要在初始页面输出中选择的值,因为在用户在提交表单数据之前多次更改它之后,上面会给出不正确的值。
我的解决方案是向填充了输出值的 select 元素添加一个“previous”属性,然后在保存时根据 Ajax 的“成功”结果更改它:
<select name="status" id="status" previous="D"> ... </select>
然后,当用户在确认弹出窗口上按下取消按钮或出现 Ajax 错误时,我刚刚做了:
$('#status').val($('#status').attr('previous')).attr('selected',true);
如果在 Ajax “成功”时将“previous”属性更改为新的成功保存的值:
$('#status').attr('previous',$('#status').children('option').filter(':selected').val());
适用于单个表单元素,但我需要进行调整,其中我有一个帐户列表,每个帐户都有一个帐户状态设置选择菜单,该菜单触发一个 jQuery UI 对话框,进而破译 Ajax 调用以保存设置,一个隐藏的表单使用.on('change')使用选择菜单中的值填充一组字段
这是选择菜单之一(通常会使用唯一 ID,但在我的情况下,有几个服务器端原因我这次不能使用它们,因此结合使用属性“rel”和“type”,相同的代码将更改保存到不同的数据库表):
<select name="status" rel="23" type="company" previous="P">
    <option value="P" selected="selected">Pending</option>
    <option value="D">Deactivated</option>
    <option value="A">Activated</option>
</select>
因为脚本中有 3 个点可能会发生失败和一个成功,所以创建一个函数是有意义的:
function set_select(saved)
    {
        var e = $(':input[type="'+$('#status-type').val()+'"][rel="'+$('#status-id').val()+'"]');
        if(saved) e.attr('previous',e.children('option').filter(':selected').val());
        e.val( e.attr('previous') ).attr('selected',true);  
    };
这是 jQuery UI 对话框代码:
    $('#update-confirm').dialog({
        autoOpen:false,
        resizable:false,
        height:230,
        modal:true,
        buttons:{
            "Change": function(){
                var exec = false;
                $dialog = $(this);
                switch($('#status-type').val())
                {
                    default: set_select(false); break;
                    case 'company': exec = 'save-company-status'; break;
                    case 'user': exec = 'save-user-status'; break;
                };
                if(exec)
                {
                    $.ajax({
                        type: 'POST',
                        url: '/sys.manager/apps.manager.php?do='+exec,
                        data: $('#form-status').serialize(),
                        success: function(response)
                        {
                            if(!response.result || response.result == 'false')
                            { 
                                console.log('Fail');
                                set_select(false);
                            } else {
                                console.log(response.result);
                                console.log(response.mail);
                                $dialog.dialog('close');
                                set_select(true);
                            }
                        },
                        error: function(response) {
                            set_select(false);
                        }
                    });
                };
            },
            Cancel: function() {
                set_select(false);
                $(this).dialog('close');
            }
        }
    });