Задать вопрос
  • Как лучше очистить старые события?

    lazalu68
    @lazalu68
    Антон, ну тут мы пришли к каким-то совсем уже базовым принципам: "а как нам выводить эту переменную в обработчике клика по контекстному меню, если переменная вне функции будет не доступна?" - надо сделать её доступной вне этой функции) То есть нужно сделать так, чтобы эта переменная была доступна и для обработчика пкм по элементу, и для обработчика лкм по меню. В целом вы вроде бы правильно поняли мою идею
  • Как лучше очистить старые события?

    lazalu68
    @lazalu68
    Антон, а, так у вас контекстное меню всегда существует, вы его просто скрываете. Ну само собой тогда нет смысла каждый раз вещать обработчик, не правда ли? Если вы его повесили, то значит повторная привязка обработчика к событию приведет к... повторной привязке обработчика к событию)) Раз у вас меню существует всегда, то вы можете например текущий нажатый элемент хранить в переменной, и соответственно при клике на меню выполнять действие с сохраненным элементом.
  • Как лучше очистить старые события?

    lazalu68
    @lazalu68
    Антон, вы уверены что привели правильный код? Это вроде один и тот же код.

    Всё, вижу разницу.

    Ну попробуйте сделать как я сказал например в предыдущем комментарии
  • Как лучше очистить старые события?

    lazalu68
    @lazalu68
    Антон, "каждая из кнопок должна исполнять различные действия, поэтому и обработчики у них разные должны быть" - нет. Каждая из кнопок должна исполнять различные действия, и это совсем не значит что у них должны быть разные обработчики. По клику на контекстное меню вы можете отслеживать на какой конкретно элемент был клик и уже в зависимости от этого совершать какие-то действия с исходным элементом.
  • Как лучше очистить старые события?

    lazalu68
    @lazalu68
    Антон, тьфу черт, случайно удалил комментарий.

    Вы можете например вешать обработчик на клик по всему контекстному меню, а не на каждую конкретную кнопку. И уже этот обработчик будет иметь доступ к нужному элементу именно так, как вы это придумали - через e.target родительского обработчика
  • Как лучше очистить старые события?

    lazalu68
    @lazalu68
    function onContextMenu(e) {
      e.preventDefault();
      let deleteBtn = document.querySelector('.delete-btn');
      
      deleteBtn.addEventListener('click', function() {
        console.log(e.target.tagName);
      });
    
      showMenu(e.clientX, e.clientY);
      document.addEventListener('click', onMouseClick, false);
    }

    5eb959964334a731048659.jpeg
    Вы в обработчике нажатия пкм вешаете еще обработчики? Серьезно?

    Не то чтоб это прям смешно и глупо, но чаще всего это великолепный способ запороть все и навешать 123498 лишних обработчиков.
  • Что необходимо исправить в моем Todo list?

    lazalu68
    @lazalu68
    Я ни в коем случае не советчик по данной теме и вряд ли понимаю её досконально, но мне кажется файлы mvc/model.js, mvc/views.js и mvc/controller.js слегка рушат mvc. Каким образом можно добавить в это приложение еще какой-нибудь компонент кроме Todo?

    Мне кажется вся суть mvc именно в том, чтобы было возможно изменение каждого компонента независимо от другого (вики): "[mvc это] схема разделения данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо". А значит просто создать где-то в вашем приложении папку mvc и файлы model/view/controller недостаточно, ибо надо именно логически разделить сущности приложения. Пока что для изменения одного конкретного компонента Todo вашего приложения нужно изменять глобальные файлы src/assets/sass/app.scss, src/page/app.pug, js/mvc/controller.js, js/mvc/model.js, js/mvc/view.js, а значит MVC тут особо нету.
  • Не понимаю, почему не бот не работает?

    lazalu68
    @lazalu68
    Мне одному кажется что в тексте ошибки вполне детально описана причина? "certificate verify failed: self signed certificate"
  • Помощь с асинхронностью JS?

    lazalu68
    @lazalu68
    montakarlo, нет, немного не так. Вот у вас в addKeysEvents есть обработчики, вы их вешайте прямо в fight а не в функции addKeysEvents, и выполняйте ресолв. Логика такая: при вызове fight вешается обработчик на клик, и в этом клике при достижении нуля хп вызывается ресолв.

    Дуболом Одноклеточный, "Извини, но зачем промисы, когда можно решить все не усложняя это промисами?" - человек уже подтвердил, что задача теоретическая, таким образом это не лишнее усложнение, а условие.

    "Кстати, вы тут из третьего мадагаскара походу" - монтекарло тоже был в мадагаскаре?
  • Помощь с асинхронностью JS?

    lazalu68
    @lazalu68
    Дуболом Одноклеточный, ну видимо задача теоретическая, то есть суть именно в том, чтобы всю процедуру игры запихнуть в функцию fight
  • Помощь с асинхронностью JS?

    lazalu68
    @lazalu68
    montakarlo, обратите внимание что код addEventListener в моем примере очень похож на код subscribe. Это потому что там по сути происходит одно и то же: мы сначала подписываемся на событие, а потом ждем соответствующего события чтобы чо-то там выполнить. Сделайте так же: запихните в промис внутри fight вызов addEventListener и в переданной функции обработчике выполняйте resolve если хп <=0
  • Помощь с асинхронностью JS?

    lazalu68
    @lazalu68
    montakarlo, в текущей логике приложения могу предложить только систему событий: при выполнении функции damage отправлять событие которое будет ловить fight и завершать свое выполнение. Звучит идиотически, но ничего лучше придумать не могу. Типа так:

    example
    let health = 50;
    const bus = new EventEmitter();
    
    function fight(){
      addKeysEvents();
      return new Promise((res, rej) => {
    	  bus.subscribe(e => {
    	  	if (e.type === 'gameover') {
    	  		bus.unsubscribe();
    	  		res();
    	  	}
    	  })
      })
    }
    
    function damage(){
      health = health -10;
      if (health <= 0) {
      	bus.trigger('gameover');
      }
    }
    
    function addKeysEvents(){
      document.addEventListener('keydown', function(event){
        if (event.code == 'KeyQ'){
          damage();
        }
      })
    }
    
    await fight();
    console.log('The game is over now!');


    Это концепт, то есть объекта EventEmitter не существует по умолчанию в JS, но зато он есть в любой реактивной библиотеке типа rxjs, также можно похожее соорудить из CustomEvents.

    Апдейт: чо-то я туплю, вам уже выше предложили достаточно адекватное решение от Владимир: обернуть addEventListener в промис, и выполнять resolve только если хп меньше или равно 0.
  • Помощь с асинхронностью JS?

    lazalu68
    @lazalu68
    montakarlo, "Нужно, чтобы функция fight заканчивала свое выполнение тогда, когда здоровье будет 0" - ну вот это уже сильно меняет дело
  • Помощь с асинхронностью JS?

    lazalu68
    @lazalu68
    montakarlo, "async function fight(){ - эта часть
    return new Promise((resolve) => - и эта часть"
    - это не может быть правдой, потому что для этой функции не нужно ключевое слово async, она и так асинхронная в виду того что возвращает промис и в её теле нигде нету await. Вы можете спокойно убрать async
  • Приходят ли пуш уведомления в PWA на IOS устройства?

    lazalu68
    @lazalu68
    А что, на iOS полноценно доступно PWA уже?
  • Какой сейчас самый лучший и прозрачный способ дебагинга JavaScript функций на сверстанном сайте?

    lazalu68
    @lazalu68
    "Я пользуюсь Sublime Text 3" - а вот не надо. Sublime Text это текстовый редактор, он существует для редактирования текста. Для этого в нем существует гибкая система выделения текста, замены по регуляркам, группировка файлов и тд. А для работы с кодом надо использовать IDE, например webstorm. Существуют тысячи полезных и удобных плагинов для ST, но они никогда не приблизят текстовый редактор к IDE по функционалу.
  • Какой алгоритм действий лучше? Как отправить POST запрос через request модуль? Как сохранять массив данных на сервере и обновлять раз в сутки?

    lazalu68
    @lazalu68
    Ну прекрасно) Мне нравятся оба варианта. Я правда в любом случае осуществлял бы любые подобные (типа поиска) процедуры на сервере, но раз вас устраивает выбранная вами реализация, то значит в вашей ситуации она подходит больше.
  • Отключился ESLint что делать?

    lazalu68
    @lazalu68
    gregorianin, ну хорошо, если новые правила вписать перед старым кодом, то что?
  • Отключился ESLint что делать?

    lazalu68
    @lazalu68
    gregorianin, это отстой. А что конкретно значит фраза "не работает"? Вы же говорите что новые ошибки подсвечивает. Значит если вы удалили весь код, а потом заново добавили, то весь код должен был подсветиться, ибо он вроде как новый уже. И где вы всё это делаете, в саблайме?