如果目标未定义,jQuery会阻止键盘按下?

时间:2018-04-29 00:18:52

标签: javascript jquery ruby-on-rails

我在rails应用程序上有一个ruby,用户可以使用键盘转到上一个或下一个问题。一次加载一个页面,其中包含指向上一页和下一页的链接。

我想要做的是,如果用户位于第一页,按左键盘箭头键根本不起作用,因为它将是未定义的。此外,如果用户位于最后一页,则按右键盘箭头键也不起作用,因为下一页将是未定义的。现在,如果用户位于第一页或最后一页并分别按下左箭头键或右箭头键,则会在我的应用程序中引发错误,指出无法找到“未定义”的URL。

我的上一个/下一个功能正常运行,但现在对如何继续这个问题感到困惑。

$(function() {
   $(document).keyup(function(e) {
    switch(e.keyCode) {
      case 37 :
        var a_href = $(this).find('a.previous_page').attr('href');
        window.location=a_href;
      break;
      case 39 :
        //window.location="/page-link-next";
        var a_href = $(this).find('a.next_page').attr('href');
        window.location=a_href;
      break;
    }
  });
});

1 个答案:

答案 0 :(得分:1)

在jQuery集合(例如.length)上使用.find来计算集合中有多少元素。

要记住的另一件事是var被提升;有两个var在函数内声明相同的变量名称并不完全有效。最好在别处(例如在顶部)声明变量名称并重新分配,或者使用除switch语句之外的其他内容,这样就可以使用const,它具有块范围并且更容易处理用:

$(function() {
  $(document).keyup(function(e) {
    const keyCode = e.keyCode;
    if (keyCode === 37) {
      const a = $(this).find('a.previous_page');
      if (a.length === 0) return;
      window.location= a.attr('href');
    } else if (keyCode === 39) {
      const a = $(this).find('a.next_page');
      if (a.length === 0) return;
      window.location= a.attr('href');
    }
  });
});

最好不要使用switch,如果你可以避免它 - 这是不必要的冗长和容易出错。