Доступ к объектной области в функции с несколькими параметрами в JS - PullRequest
0 голосов
/ 28 июня 2018

Я получил эту функцию:

const debounce = (func, delay) => {
  let inDebounce;

  return function() {
    const context = this
    const args = arguments
    clearTimeout(inDebounce)
    inDebounce = setTimeout(() => func.apply(context, args), delay)
  }
}

var likes_btn = document.getElementsByClassName("js-submit-like");

for (var i = 0; i < likes_btn.length; i++) {
  likes_btn[i].addEventListener('click', debounce(function(el) {
    alert("hello");

    el.preventDefault();
  }, 500));
}

Дело в том, что мне нужно использовать .preventDefault() до того, как будет запущен дебад. В настоящее время действительно происходит то, что выполняется в конце debounce(), а не в области действия функции.

Как я могу войти в область действия функции? Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Создайте отдельный debouncer обратный вызов, который слушатель может закрыть:

const debounce = (func, delay) => {
  let inDebounce;

  return function() {
    const context = this
    const args = arguments
    clearTimeout(inDebounce)
    inDebounce = setTimeout(() => func.apply(context, args), delay)
  }
}

var likes_btn = document.getElementsByClassName("js-submit-like");

for (let i = 0; i < likes_btn.length; i++) {
  const button = likes_btn[i];
  const debouncer = debounce((e) => console.log("Hello", button), 500); // you can also use e.target to refer to the button
  button.addEventListener('click', function(e) {
    console.log("clicked");
    debouncer(e);
    e.preventDefault();
  });
}
<a class="js-submit-like" href="http://www.facebook.com/">Like</a>

<a class="js-submit-like" href="http://www.facebook.com/">Like 2</a>
0 голосов
/ 28 июня 2018

Просто переместите его за пределы обратного вызова debouncer:

const debouncer = debounce(() => alert("hello"), 500);
likes_btn[i].addEventListener('click', function(event) {
   event.preventDefault();
   debouncer(event);
});

Это может быть немного элегантнее с некоторыми связанными функциями:

 const both = (fn1, fn2) => (...args) => (fn1(...args), fn2(...args));
 const stop = event => event.preventDefault();
 const listen = (el, name, handler) => el.addEventListener(name, handler);

 for(const btn of likes_btn) {
   listen(btn, "click", both(
    debounce(() => alert("hello"), 500),
    stop
   ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...