09.02.2010, 18:18
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
примечательно, что cancelBubble работает во всех браузерах
__________________
.ня
|
|
23.03.2010, 12:46
|
Новичок на форуме
|
|
Регистрация: 23.03.2010
Сообщений: 9
|
|
Сделал 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 но хоть что-то
|
|
23.03.2010, 12:56
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
ага, я попробовал с синхронным и обламался х)
__________________
.ня
|
|
23.03.2010, 13:13
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
решётку запрашивать - не вариант. ибо если не прокэшируется, то это жопа.
ещё у тебя несколько раз должна вызываться функция при каждом изменении состояния. поэтому надо удалять обработчик при первом использовании, как у меня.
__________________
.ня
|
|
23.03.2010, 13:19
|
Новичок на форуме
|
|
Регистрация: 23.03.2010
Сообщений: 9
|
|
1 надо проверить, мне кажется что он пытается выполнить стандартный запрос якоря на текущей странице, как при клике на ссылку, так что тут даже вероятно и запроса то к серверу не идёт
2 выполнять 2 раза не будет, т.к. после выполнения я обnullяю process : D хотя проще было убить хэндлер, это да, затупил
Как проверить проще всего? Не хочется ставить мониторов соединений никаких
Последний раз редактировалось artyv, 23.03.2010 в 13:23.
|
|
23.03.2010, 13:32
|
Новичок на форуме
|
|
Регистрация: 23.03.2010
Сообщений: 9
|
|
Проверил синхронность. FAIL
|
|
23.03.2010, 13:38
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
м.. не, реквесты не катят - ошибки глотаются =(
__________________
.ня
|
|
23.03.2010, 13:39
|
Профессор
|
|
Регистрация: 20.03.2008
Сообщений: 1,183
|
|
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
}
__________________
.ня
|
|
23.03.2010, 13:41
|
Новичок на форуме
|
|
Регистрация: 23.03.2010
Сообщений: 9
|
|
У меня такое наблюдается только в FF3.6, в более старых версиях ок, возможно дело в плагинах.
А с синхронностью обстоит так: в FF при синхронном запросе onreadystatechange не выполняется, а во всех остальных браузерах выполняется, но в IE всегда почему-то только один раз
|
|
23.03.2010, 15:04
|
Новичок на форуме
|
|
Регистрация: 23.03.2010
Сообщений: 9
|
|
В общем всё решилось, кроме того, что 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
|
|
|
|