примечательно, что cancelBubble работает во всех браузерах
|
Сделал DOM-независимое решение:
/** * Javascript ThreadBox * * DOM-independent implementation of FThread {@link http://habrahabr.ru/blogs/javascript/86852/} * * Usage: threadBox([context,] function); * * @author Vasiliy Aksyonov <outring@gmail.com> * @version 1.0 */ var threadBox = (function() { var thread; try { thread = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { thread = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { thread = false; } } if (!thread && typeof XMLHttpRequest != 'undefined') { thread = new XMLHttpRequest(); } if(thread) { var threadBox = function () { var context = arguments.length >= 2 ? arguments[0] : null; var process = arguments.length >= 2 ? arguments[1] : arguments[0]; thread.onreadystatechange = function() { if (!process) { return; } var innerProcess = process; process = null; innerProcess.call(context); }; thread.open('GET', '#', true); thread.send(null); } } else { var threadBox = function () { var context = arguments.length >= 2 ? arguments[0] : null; var process = arguments.length >= 2 ? arguments[1] : arguments[0]; try { process.call(context); } catch(e) { setTimeout(function() { throw e; }, 0); } } } return threadBox; })(); Несмотря на то, что делаем асинхронный XMP запрос, работает вроде синхронно. Способ использования отличается конечно, но ничто не мешает переделать, но на мой взгляд (мне) так удобнее : D Ну и да, как видно добавлен небольшой костыль внизу, на всякий случай, в хроме он конечно не сильно поможет : D но хоть что-то |
ага, я попробовал с синхронным и обламался х)
|
решётку запрашивать - не вариант. ибо если не прокэшируется, то это жопа.
ещё у тебя несколько раз должна вызываться функция при каждом изменении состояния. поэтому надо удалять обработчик при первом использовании, как у меня. |
1 надо проверить, мне кажется что он пытается выполнить стандартный запрос якоря на текущей странице, как при клике на ссылку, так что тут даже вероятно и запроса то к серверу не идёт
2 выполнять 2 раза не будет, т.к. после выполнения я обnullяю process : D хотя проще было убить хэндлер, это да, затупил Как проверить проще всего? Не хочется ставить мониторов соединений никаких |
Проверил синхронность. FAIL
|
м.. не, реквесты не катят - ошибки глотаются =(
|
var FThread= new function(){ Version: 5 Description: 'creates a wrapper for function that allows you to not be afraid of exceptions in' License: 'public domain' Implementation: var FThread= function( proc ){ var thread= function( ){ var res, self= this, args= arguments var starter= new XMLHttpRequest starter.onreadystatechange= starter.onabort= function( ev ){ starter.onreadystatechange= starter.onabort= null res= thread.proc.apply( self, args ) } //console.dir( starter ) starter.open( 'get', '#', true ) starter.send( null ) starter.abort() return res } thread.proc= proc return thread } //Export: return FThread Usage: var inverse= FThread(function( a ){ if( a === -1 ) (void 0)() if( a === 0 ) throw Error( 'division by zero' ) return 1/a }) alert([ inverse( -1 ), inverse( 0 ), inverse( 1 ) ]) // alerts ",,1" and two exceptions in console log } |
У меня такое наблюдается только в FF3.6, в более старых версиях ок, возможно дело в плагинах.
А с синхронностью обстоит так: в FF при синхронном запросе onreadystatechange не выполняется, а во всех остальных браузерах выполняется, но в IE всегда почему-то только один раз |
В общем всё решилось, кроме того, что FF>=3.5 проглатывает ошибки зачем то : (
Вот как поменялась функция: var threadBox = function () { var context = arguments.length >= 2 ? arguments[0] : null; var process = arguments.length >= 2 ? arguments[1] : arguments[0]; thread.open('GET', '#', Array.toSource ? true : false); thread.onreadystatechange = function () { thread.onreadystatechange = function () { }; process.call(context); }; thread.send(null); } Пока что ищу решение, как заставить ФФ не глотать : D |
Часовой пояс GMT +3, время: 10:47. |