【问题标题】:Switch Case with If Statements - Javascript & Jquery使用 If 语句切换大小写 - Javascript 和 Jquery
【发布时间】:2021-07-11 07:22:28
【问题描述】:

这段代码有什么问题?它应该捕获 #ts_container div 中的所有点击,这些点击要么是按钮,要么是锚点。它还应该捕获按键事件。

我正在尝试在每个案例中应用一个 If 语句来确定是否按键和/或单击,如果是,它将新的 div 名称重写为开关案例底部的表达式,然后当前文本将淡出和新的文本淡入。W/o Keypress 它工作正常。正如现在所写的那样,当您单击时它仍然可以正常工作,但我无法让它触发按键事件,而且我不确定我做错了什么。

jQuery(document).ready(function($) {
    $('#ts_container').on('click keypress', 'button, a', function(e) {
        var id = $(this).attr("id");
        var fade_out;
        var fade_in;

        switch (id) {
            case 'start':
                if ((e.type === 'keypress' && e.which === 13) || (e.type == 'click')) {
                    fade_out = '#start_1';
                    fade_in = '#step_0';
                }
                break;
            case 'AC':
                if ((e.type === 'keypress' && e.which === 49 || e.which === 97) || (e.type == 'click')) {
                    fade_out = '#step_0';
                    fade_in = '#step_AC_1';
                }
                break;
            case 'step_AC_Continue_1':
                if ((e.type === 'keypress' && e.which === 13) ||
                    (e.type == 'click')) {
                    fade_out = '#step_AC_1';
                    fade_in = '#step_AC_2';
                }
                break;
            case 'Step_0_Option_1':
                if ((e.type === 'keypress' && e.which === 50 || e.which === 98) || (e.type == 'click')) {
                    fade_out = '#step_0';
                    fade_in = '#step_Heat_1';
                }
                break;
            case 'step_AC_Option_1':
                if ((e.type === 'keypress' && e.which === 49 || e.which === 97) || (e.type == 'click')) {
                    fade_out = '#step_AC_2';
                    fade_in = '#step_AC_3';
                }
                break;
            case 'step_AC_Option_2':
                if ((e.type === 'keypress' && e.which === 50 || e.which === 98) || (e.type == 'click')) {
                    fade_out = '#step_AC_2';
                    fade_in = '#step_AC_solution_electrical';
                }
                break;
            case 'step_AC_Option_3':
                if ((e.type === 'keypress' && e.which === 51 || e.which === 99) || (e.type == 'click')) {
                    fade_out = '#step_AC_2';
                    fade_in = '#step_AC_circuit_breaker';
                }
                default:
                    fade_out = '#start_1';
                    fade_in = '#step_0';
        }

        $(fade_out).fadeTo('fast', 0).css('visibility', 'hidden')
            .css('display', 'none');

        $(fade_in).delay(800).css('visibility', 'visible')
            .css('display', 'block').fadeTo('slow', 1);
    });
});

【问题讨论】:

  • 请添加正确缩进的代码,这样的代码很难调试。尝试添加调试器。

标签: javascript jquery onclick switch-statement keypress


【解决方案1】:

大部分if 语句中的括号都不正确:

if ((e.type === 'keypress' && e.which === 49 || e.which === 97) || (e.type == 'click'))
if ((e.type === 'keypress' && e.which === 50 || e.which === 98) || (e.type == 'click'))
if ((e.type === 'keypress' && e.which === 49 || e.which === 97) || (e.type == 'click'))
if ((e.type === 'keypress' && e.which === 50 || e.which === 98) || (e.type == 'click'))
if ((e.type === 'keypress' && e.which === 51 || e.which === 99) || (e.type == 'click')) 

&& 优先于 ||,所以这些最终是:

if (((e.type === 'keypress' && e.which === x) || e.which === y) || (e.type == 'click')) 

将它们更改为:

if (e.type === 'keypress' && (e.which === x || e.which === y) || e.type == 'click') 

翻译为:

  • 必须是keypress,代码为xy,或者
  • 这是一个点击事件。

您还在buttona 元素上注册事件处理程序:

.on('click keypress', 'button, a'

这些通常不会监听键盘事件,除非您已经专注于它们。

解决方法是单独声明函数,并像这样注册处理程序:

function handleEvent(e) {
    // Do stuf
}

$('#ts_container').on('click', 'button, a', handleEvent);
$(window).on('keypress', handleEvent);

【讨论】:

  • 您好 Cerbrus,感谢您的协助。不幸的是,这不起作用,它仍然不会触发按键。
  • 是的,我发现了另一个问题。我已经更新了我的答案。
  • 实际上并没有成功。它在第一种情况下触发,但在那之后就不起作用了。当第一种情况(第一页加载)并按下继续按钮或在键盘上输入时,它会触发隐藏第一页并加载第二页。但是在第二页上,没有任何效果。
  • 这是一个实际使用的例子jsfiddle.net/0xvdsoem
  • $(this).attr("id"); 在那里引用了错误的对象...对于键盘盒,您需要以不同的方式获得它...
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
相关资源
最近更新 更多