【问题标题】:How do I get the cancelled alert to return to the same former option after alert "cancel"?如何让取消的警报在警报“取消”后返回到相同的前一个选项?
【发布时间】:2017-07-17 18:12:05
【问题描述】:

在警报中选择“取消”后,如何让选项框返回到之前选择的相同位置?

现在代码可以正常工作,现在它转到名为“Common Languages”的“禁用”选项,没有任何功能。这不是它应该的工作方式。

我想要的是在警报中选择“取消”后返回之前选择的选项。

JavaScript:

<script type="text/javascript">
$(document).on('click', ':not(form)[data-confirm]', function(e){
    if(!confirm($(this).data('confirm'))){
        e.stopImmediatePropagation();
        e.preventDefault();
    }
});

$(document).on('submit', 'form[data-confirm]', function(e){
    if(!confirm($(this).data('confirm'))){
        e.stopImmediatePropagation();
        e.preventDefault();
    }
});

$(document).on('input', 'select', function(e){
    var msg = $(this).children('option:selected').data('confirm');
    if(msg != undefined && !confirm(msg)){
        $(this)[0].selectedIndex = 0;
    }
});
</script>

HTML:

<select name="LangF" id="opt">
<option value="" disabled>Common Languages:</option>
<option value="zh-CN">Chinese (Simplified)</option>
<option selected value="en">English</option>
<option value="fr">French</option>
<option value="de">German</option>
<option value="ru">Russian</option>
<option value="es">Spanish</option>
<option value="" disabled>&#8212;</option>
<option value="auto" data-confirm=" The ´´Automatic Language Detection´´ does not detect laguadges in frames / sandbox. Are you sure you want to select this option? ">Auto Detect</option>
<option value="" disabled>&#8212;</option>
<option value="" disabled>Other Languages:</option>
<option value="af">Afrikaans</option>
<option value="sq">Albanian</option>
<option value="ar">Arabic</option>
<option value="hy">Armenian</option>
<option value="az">Azerbaijani</option>
</select>

现在它可以工作,但问题是它转到名为“Common Languages:”的选项的 1 值,即“禁用”。我认为必须有一种方法可以使它转到另一个值,例如如果不是以前的选定值,则从选项中称为“English”的自动“选定”值。

【问题讨论】:

    标签: javascript jquery html alert option


    【解决方案1】:

    这是您的解决方案(总代码):

    <script type="text/javascript">
    $(document).on('click', ':not(form)[data-confirm]', function(e){
        if(!confirm($(this).data('confirm'))){
            e.stopImmediatePropagation();
            e.preventDefault();
        }
    });
    
    $(document).on('submit', 'form[data-confirm]', function(e){
        if(!confirm($(this).data('confirm'))){
            e.stopImmediatePropagation();
            e.preventDefault();
        }
    });
    var arr = [];
    $(document).on('input', 'select', function(e){
        arr.push($(this)[0].selectedIndex)
        var msg = $(this).children('option:selected').data('confirm');
        if(msg != undefined && !confirm(msg)){
            $(this)[0].selectedIndex = arr[arr.length-2];
        }
    });
    </script>  
    

    这里没有任何变化:

    <select name="LangF" id="opt">
    <option value="" disabled>Common Languages:</option>
    <option value="zh-CN">Chinese (Simplified)</option>
    <option selected value="en">English</option>
    <option value="fr">French</option>
    <option value="de">German</option>
    <option value="ru">Russian</option>
    <option value="es">Spanish</option>
    <option value="" disabled>&#8212;</option>
    <option value="auto" data-confirm=" The ´´Automatic Language Detection´´ does not detect laguadges in frames / sandbox. Are you sure you want to select this option? ">Auto Detect</option>
    <option value="" disabled>&#8212;</option>
    <option value="" disabled>Other Languages:</option>
    <option value="af">Afrikaans</option>
    <option value="sq">Albanian</option>
    <option value="ar">Arabic</option>
    <option value="hy">Armenian</option>
    <option value="az">Azerbaijani</option>
    </select>
    

    确实有效。

    【讨论】:

    • 好吧,要么我很困惑,要么我不知道该怎么做。我无法使您的代码与我使用的代码一起工作。所以你能告诉我一个例子吗?也许我做错了什么。
    • 好的,如果你选择英语,这个选择的语言会被推入我们全局声明的数组中,然后你会选择自动检测,点击的时候会弹出一个框取消后,该选项将保留在相同的旧语言上,即英语。 @SeekLoad
    • 同意这正是我希望它工作的方式,遗憾的是它在我的页面上不起作用。我不知道我对你的代码做错了什么?
    • 是的,没错,我不确定这个函数结构,但我会注意的。 @SeekLoad
    • 是的,不知何故会有很多if声明。 @SeekLoad
    【解决方案2】:

    表单加载后,将状态缓存在对象中。您可以编写一个函数来更新此缓存对象,以便在成功后您可以轻松地更新缓存,以备将来发生取消或错误时使用。您可以创建另一个函数来循环缓存对象并设置属性(和值)。这是我所知道的不使用页面重新加载或通过 ajax(websocket 等)重新加载数据的唯一方法。

    【讨论】:

    • 现在它可以工作,但问题是它转到选项的 1 值,即“Common Languages:”值,即“禁用”。我认为必须有一种方法可以使它转到另一个值,例如如果不是以前的选定值,则从选项中称为“English”的自动“选定”值。
    • 我想我现在明白了。用户选择和选项,并且选择元素的重置默认为第一个项目,而不是在提交表单并且用户取消提交时选择的项目。您仍然可以缓存所选内容。添加一个事件监听,当 select 语句改变时,更新缓存的元素。然后在取消时,让表单重置,然后更新选择了哪个选项。如果您只想要第一个未禁用的选项,请使用以下内容: $($('#opt option"]').attr('disabled', 'false')[0]).prop('selected', '选中');
    • 有点长,但现在添加了更新。
    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多