Задать вопрос
  • Как правильно решить данную задачу?

    lazalu68
    @lazalu68
    Щас бы учебные задачи на форумы постить
  • Как правильно преобразовать код в es5?

    lazalu68
    @lazalu68
    lagudal, в ответе две части, смотрите: "либо настроить Babel на IE-11, либо полифилл использовать типа es5-shim". Первая это "настроить babel", который транспилирует код. Вторая это "использовать полифилл", который реализует все отсутствующие функции.

    Если у вас forEach не работает, значит возможно вы справились с первой частью, но завалили вторую. Подключите полифилы чтобы forEach заработал.

    Кстати вам правильно пишут, forEach сильно вряд ли может быть проблемой. Вместо "Если я понимаю правильно" покажите код ошибки.
  • Как вместо обычной строки подставлять в код заместо нее “обрезанную” с помощью substring() строку?

    lazalu68
    @lazalu68
    Может я какой-то грубый и не очень хороший человек, но мне кажется описанное вами это приблизительно как взять из холодильника торт, съесть часть, а потом ВНЕЗАПНО забыть о существовании холодильника и написать на форуме вопрос "как положить торт в холодильник?"
  • Тестирования сайта на разных версиях ОС?

    lazalu68
    @lazalu68
    А браузерстека есть полноценные аналоги?
  • Как лучше очистить старые события?

    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 уже?