Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 09.02.2010, 18:18
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

примечательно, что cancelBubble работает во всех браузерах
__________________
.ня
Ответить с цитированием
  #32 (permalink)  
Старый 23.03.2010, 12:46
Новичок на форуме
Отправить личное сообщение для artyv Посмотреть профиль Найти все сообщения от artyv
 
Регистрация: 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 но хоть что-то
Ответить с цитированием
  #33 (permalink)  
Старый 23.03.2010, 12:56
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

ага, я попробовал с синхронным и обламался х)
__________________
.ня
Ответить с цитированием
  #34 (permalink)  
Старый 23.03.2010, 13:13
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

решётку запрашивать - не вариант. ибо если не прокэшируется, то это жопа.
ещё у тебя несколько раз должна вызываться функция при каждом изменении состояния. поэтому надо удалять обработчик при первом использовании, как у меня.
__________________
.ня
Ответить с цитированием
  #35 (permalink)  
Старый 23.03.2010, 13:19
Новичок на форуме
Отправить личное сообщение для artyv Посмотреть профиль Найти все сообщения от artyv
 
Регистрация: 23.03.2010
Сообщений: 9

1 надо проверить, мне кажется что он пытается выполнить стандартный запрос якоря на текущей странице, как при клике на ссылку, так что тут даже вероятно и запроса то к серверу не идёт
2 выполнять 2 раза не будет, т.к. после выполнения я обnullяю process : D хотя проще было убить хэндлер, это да, затупил

Как проверить проще всего? Не хочется ставить мониторов соединений никаких

Последний раз редактировалось artyv, 23.03.2010 в 13:23.
Ответить с цитированием
  #36 (permalink)  
Старый 23.03.2010, 13:32
Новичок на форуме
Отправить личное сообщение для artyv Посмотреть профиль Найти все сообщения от artyv
 
Регистрация: 23.03.2010
Сообщений: 9

Проверил синхронность. FAIL
Ответить с цитированием
  #37 (permalink)  
Старый 23.03.2010, 13:38
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

м.. не, реквесты не катят - ошибки глотаются =(
__________________
.ня
Ответить с цитированием
  #38 (permalink)  
Старый 23.03.2010, 13:39
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 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

}
__________________
.ня
Ответить с цитированием
  #39 (permalink)  
Старый 23.03.2010, 13:41
Новичок на форуме
Отправить личное сообщение для artyv Посмотреть профиль Найти все сообщения от artyv
 
Регистрация: 23.03.2010
Сообщений: 9

У меня такое наблюдается только в FF3.6, в более старых версиях ок, возможно дело в плагинах.
А с синхронностью обстоит так: в FF при синхронном запросе onreadystatechange не выполняется, а во всех остальных браузерах выполняется, но в IE всегда почему-то только один раз
Ответить с цитированием
  #40 (permalink)  
Старый 23.03.2010, 15:04
Новичок на форуме
Отправить личное сообщение для artyv Посмотреть профиль Найти все сообщения от artyv
 
Регистрация: 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
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск