Устойчивость системы обработчиков к ошибкам
Классическая система кроссбраузерного добавления событий, описанная в предыдущей статье, неустойчива к ошибкам выполнения обработчиков.
Если какой-нибудь обработчик содержит ошибку, то, генерируя исключение, он ломает цикл вызова остальных обработчиков текущего элемента/события.
Получается, что обработчики зависят друг от друга. Есть различные способы, как этого избежать.
Можно завернуть вызов каждого обработчика в try .. catch . Тогда исключение будет поймано.
Что делать дальше?
Есть варианты.. Например, библиотека Yahoo UI хранит последнее пойманное исключение в специальной переменной lastError . А фреймворк Mochikit собирает все пойманные исключения в errors .
В коде ниже проиллюстрирован подход из Mochikit:
function commonHandle(event) {
event = fixEvent(event)
handlers = this.events[event.type]
// (1)
var errors = []
for ( var g in handlers ) {
try {
var ret = handlers[g].call(this, event)
if ( ret === false ) {
event.preventDefault()
event.stopPropagation()
}
} catch(e) {
// (2)
errors.push(e)
}
}
// (3)
if (errors.length == 1) {
throw errors[0]
} else if (errors.length > 1) {
var e = new Error("Multiple errors thrown in handling 'sig', see errors property");
e.errors = errors
throw e
}
}
- Инициализуется массив
errors для исключений
- Все исключения - добавляем в массив, при этом не прерывая цепочку обработчиков.
- Если была только одна ошибка - кидаем ее дальше. Иначе делаем общий объект
Error со списком ошибок в свойстве errors и кидаем его.
Каждый вызов обработчика можно завернуть в setTimeout .
Пожалуй, это самый простой способ.
// вместо
handlers[g].call(this, event)
// поставить
setTimeout(function() { handlers[g].call(..) }, 0)
При этом - да, обработчики будут вызваны независимо. Но к моменту, когда сработает setTimeout - событие будет уже "мертво", нельзя будет ни вызвать preventDefault , ни отменить всплытие.
Кроме того, setTimeout не гарантирует последовательность исполнения и является асинхронным, в то время как реальная система обработчиков должна работать синхронно.
Поэтому, увы, этот способ никак не годится.
Этот подход описан Dean Edwards в статье Callbacks and Events
Он заключается в том, что каждое событие заворачивается не в setTimeout , а в dispatchEvent (fireEvent для IE).
Таким образом, события вызываются в независимых потоках выполнения и инициируют ошибки независимо.
Есть несколько вариантов, как сделать систему событий устойчивой к ошибкам.
Жизнеспособны - первый подход (YUI/Mochikit) и последний (Dean).
Их можно с успехом использовать на практике.
|
http://javascript.ru/forum/project/7558-ftread-ispolnenie-funkcijj-v-otd...
.ня
Мы ценим, что вы нашли время, чтобы поделиться своими мыслями. Я прочитал ряд статей на ту же тему! Однако, в отличие от других статей, которые я читал, ваша произвела на меня глубокое впечатление. Я надеюсь, что вы и дальше будете публиковать полезные посты, подобные этому, чтобы все могли их прочитать. krunker
Totalmente de acuerdo con lo que ha mencionado nuestro compañero forero. Yo también estoy aprendiendo poco a poco los lenguajes de programación, ya que mi principal pasión es el diseño de moda como la ropa y el calzado. He trabajado para grandes marcas de México como Catalogos Andrea y también Catalogos Cklass
Espero que a todos les vaya bien.
Я оборачиваю вызов каждого обработчика в try, и в catch делаю setTimeout с повторной генерацией оригинальной ошибки. В результате, и выполнение обработчиков не прерывается, и ошибка будет показана родная, то есть будет показана и строка в которой возникла ошибка и прочая инфа.
Спасибо вам за статьи. Сам бы только много позже обратил бы внимание на такой момент
правильная строка будет показана лишь в фф, а остальные покажут куда попало.
а вообще, забавно - сначала отказываемся от нативных событий эмулируя их через свой объект, а потом для вызова каждого обработчика генерируем нативное событие, чтобы он не ронял остальные хD не проще ли сразу честно вешать обработчики на события?
.ня
не проще ли сразу честно вешать обработчики на события?
Если бы евенты во всех браузерах были одинаковые, тогда и не было б необходимости отказываться от нативных событий эмулируя их через свой объект
Не вижу проблемы в том, что при падении одного обработчика, прекращается выполнение других.
Если в каком-то обработчике ошибка - значит приложение в целом неработоспособно, и выполнять остальные обработчики нет смысла.
можно посмотреть образцы создания любых программ и сайтов. То, что нужно!
thanks for sharing this!! tyler fence companies
I agree! fencing dothan al
this is great, thanks for sharing granite countertops spokane
Thank you for sharing, I find the various alternatives that the collection of tutorials always brings us very useful and very useful. ancrea catalogos
I never really did get into the whole BDSM thing. I thought that it was a bit too wild for my taste. I prefer a more conventional sexual experience. I don’t like to experiment that much because I don’t need that kind of adrenaline in my life. I like it safe and secure and available now in mobile legends pc. I don’t want anything to awaken in me that I would regret. I have a very addictive personality and if I try BDSM, I might get addicted and that would totally hamstring my dating life in roblox download.
slope unblockedWow, this is very interesting reading. I found a lot of things which I need. Great job on this content. This is very interesting reading. Great job on this content. I like itcookie clicker
This weblog is fantastic. I really like studying your articles. Keep up the good writings! You realize, a lot of persons are hunting around for this info, you can help them greatly.
strata painting Cessnock
You are definitely right. This article is very informative and helpful. | nycdemolitioncontractor.com
Roxa głogów
Israel withdrew ufa1688 from Gaza in 2005 but, ufabet เข้า สู่ระบบ with the help of Egypt, clamps 1688.com down on the borders of the ทางเข้า Ufa 1688 enclave now governed by แทงบอลออนไลน์ Hamas Islamists. Dream Gaming Palestinian Big gamingauthorities have limited self-rule ลิงค์รับทรัพย์ in the West Bank บาคาร่าwhich is dotted หวยออนไลน์with Israeli settlements.
friday night funkin has become a popular activity that is done on fridays. This is because it's not just a night to have fun, but also one to get rid of stress and anxiety.
The other reason for this trend is because friday nights are usually free from work obligations, which means that people can be more creative and have more fun than usual.
You should also join fnaf, the best horror game out there!
The first time you press (starting the loop), the spaces are removed.
See: www.app1.findit.com/About/xdfthmrvicsgghu
Thank you for your post. I have read through several similar topics! However, your article gave me a very special impression, unlike other articles. I hope you continue to have valuable articles like this or more to share with everyone! poppy playtime
word hurdle is a sport with simple rules that makes it accessible to players of all ages. You may jump right into the action without any pregame warmups.
I read a lot about related stuff! Contrary to other articles I have read, Your article is really engaging, providing me with a lot of valuable information. I hope you will continue to write great blog posts like this for everyone to read.
redactle game
Members are called for a heated debate for the individuals. The manners of the E85 Gas Station Near Me are invested in the goals. Triumph is fit and experienced for the use of the options for the cities.
Этот блог был расположен. Принимая во внимание все обстоятельства 2048, я обнаружил в вашем письме новую информацию, относящуюся к тому, что вы нам предложили. Глава чрезвычайно полезна, и я особенно благодарен за поразительную глубину вашей статьи.
Я наткнулся на этот блог. В свете того, что вы 1001 games нам посоветовали, я обнаружил в вашем посте свежую информацию. Мозг очень наполняет, и я благодарен за поразительную глубину вашей статьи.
There are numerous amusing online games available; I enjoy playing trap the mouse in my free time.
I was impressed by the author's chat gpt login ability to take a complex subject and break it down into easily digestible pieces, making it accessible to readers from all walks of life.
Thank you so much for sharing. I've learned a lot by opening up new ideas. That's why I like your blog so much. This blog has a lot of knowledge for me to learn. Come on, it's really great. https://totowho.com
You make so many great points here that I've read your post a few times. Your point of view is in line with mine for the most part lolbeans. This content is great for readers.
Не было бы причин отказываться от the backrooms нативных событий в пользу эмуляции объектов, если бы они были согласованы во всех браузерах.
It's amazing to see my kid's reaction when they unlock new icons and colors in Geometry Dash.
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.