如何使用布尔标志跳过特定事件?

时间:2019-04-11 07:23:31

标签: javascript events boolean flags touchstart

我正在制作一个函数,该函数将两个事件组合在一个on方法中,以便更好地控制和编辑,就像这样:

class EventManager {
  constructor($el) {
    this.$el = $el;
    this.mainSwitch = false;
    this.subSwitch = false;
    this.condition = (!this.mainSwitch && !this.subSwitch); // false false then
    this.condition2 = (!this.mainSwitch && this.subSwitch); // false true then
  }
  start(e) {
    if (this.condition) {
      console.log(e.type);
      this.mainSwitch = true;
      return false; // return keyword for end the function
    } else if (this.condition2) {
      this.mainSwitch = false;
      this.subSwitch = false; // Go back to the default statement.
      return false;
    }
    return false;
  }
  move(e) {
    if (this.mainSwitch == true && this.subSwitch == false) {
      console.log(e.type);
    }
  }
  end(e) {
    if (this.mainSwitch == true && this.subSwitch == false) {
      console.log(e.type);
      this.mainSwitch = false;
      this.subSwitch = true;
    }
  }
  apply() {
    this.$el.on('touchstart mousedown', (e) => {
      this.start(e);
    })
    $('html').on({
      ['touchmove mousemove']: (e) => this.move(e),
      ['touchend mouseup']: (e) => this.end(e)
    })
  }
}
var thatEvent = new EventManager($('#link'));
thatEvent.apply();
      a {
        width: 100%;
        height: 100px;
        border-radius: 10px;
        background-color: brown;
        font-family: Helvetica;
        display: flex;
        flex-flow: row;
        justify-content: center;
        align-items: center;
      }
    <a id="link" target="_blank" href="https://google.co.uk" draggable="false">
      Click/Touch and Drag/Swipe
    </a>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

我添加了布尔标志来跳过特定的events group mouseevents,因为当我touch元素时此代码运行两次。

问题是,布尔标志不会像我期望的那样跳过mousedown事件。管理this.condition2之后,它会回滚以比较this.condition。然后触发console.log(e.type)

起初,我认为布尔标志可以跳过event。因为我在每个return节中添加了if关键字,以便在比较完成后切断函数。

此问题导致mousedown事件将被永久禁用。为了使用mousedown事件,应该将this.mainSwitchthis.subSwitch这两个标志都设置为falses,但是在我管理touchstart之后,将布尔值设置为{ {1}}和false,因此true事件无法再使用。

有什么方法可以使用javascript中的布尔标志来实际跳过事件?

1 个答案:

答案 0 :(得分:1)

您事件中的{p}值this.conditionthis.condition2都没有改变。

您仅更改mainswitchsubswitch变量。这并不意味着您同时更改这两个变量也会更改this.condition变量。因为此值仅从initialization/contructor设置

最好将this.condition对象更改为一个函数,使其更具动态性。因此它将始终依赖于您的主开关和子开关