Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

DOM:window.setTimeout/window.setInterval для IE. (AKS)
Author Message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Jul 28, 2007 8:01 am (написано за 12 минут)
   Post subject: DOM:window.setTimeout/window.setInterval для IE.
Reply with quote

Как известно, методам DOM:window.setTimeout (developer.mozilla.org/en/docs/DOM:window.setTimeout)/DOM:window.setInterval (developer.mozilla.org/en/docs/DOM:window.setInterval) можно передавать дополнительные параметры. Иногда это может пригодиться! К сожалению в "главном" браузере (IE) такой возможности не существует. А что делать, если хочется ее поиметь? :)
Я решил попытаться написать функцию для замены стандартных методов. И чтобы вы думали? Ведь написал! :) Правда написал я ее под руководством Zeroglif'а (при прочтении темы (forum.vingrad.ru/forum/topic-165006.html), где "родилась" эта функция, даже можно сказать, что написал чуть ли не он, просто моими руками :) ). Благодарю его за то, что уделил мне достаточно времени и внимания.
Кстати, тема эта далеко не новая - вот (webreflection.blogspot.com/2007/06/simple-settimeout-setinterval-extra.html) и вот (ecmascript.stchur.com/2006/06/07/settimeout-revisited/) ссылки на похожие темы, которые Zeroglif (еще и еще раз ему спасибо!) предложил к ознакомлению.
Возвращаясь к функции, могу сказать, что кроме как в IE мне удалось ее потестировать еще и в старой Opera 7.23 (в которой тоже нет возможности передавать доп. параметры). Результаты тестов, на мой взгляд, ничем не отличаются от поведения этих методов в современных браузерах.
Вот описание основных действий, происходящих в этой функции:
1. Сохраняется ссылка на "родной" метод и предпринимается попытка проверить, на самом ли деле он тот, за кого себя выдает.
2. Стандартному идентификатору присваивается новый метод.
3. Определяются переменные:
  1) со ссылкой на переданные аргументы;
  2) кол-во аргументов;
  3) позиция, с которой должны начинаться доп. аргументы;
  4) тип кода первого аргумента (может быть функция, строка или объект);
  5) наличие третьего аргумента и совпадает ли он с одной из трех допустимых строк;
  6) является ли первый аргумент одним из методов объекта window (confirm, open, itc);
  7) какой из методов будет использован для передачи доп. аргументов - apply или eval;
  8) зависящая от предыдущего логического значения переменная - строка для eval или массив для apply;
  9) разделитель для строки с аргументами;
  10) возвращаемая функция.
4. Если методам window.setTimeout/window.setInterval будет передана строка - все остается без изменений.
5. Если передана функция или метод объекта window, а также дополнительные аргументы, то эти аргументы необходимо собрать в строку или массив.
6. Создается функция, которая и будет передана оригинальному методу.
7. Возвращается стандартный идентификатор таймера или интервала.
Вот код функции:
Code (JavaScript): скопировать код в буфер обмена
function XpandDelaySetter(aMethod) {
    var fnOriginal = window[aMethod],
        bNative = /\[native\scode\]/.test(fnOriginal);
    if (!bNative) {
        return false;
    };
    window[aMethod] = function (aFunc, aDelay, aLang) {
        var oArgs = arguments,
            iLen = oArgs.length,
            iIter = 2,
            vCodeType = typeof (aFunc),
            bCheckLang = iLen === 3 &&
                /^(jscript|javascript|vbscript)$/i.test(aLang),
            bHostMeth = vCodeType == 'object' &&
                /function/.test(aFunc),
            bEval = !Function.prototype.apply || bHostMeth,
            vParams = bEval ? '' : [],
            sDiv = '',
            fnCallBack;
        if (vCodeType == 'string' || bCheckLang) {
            fnCallBack = aFunc;
        } else if ((vCodeType == 'function' || bHostMeth) &&
                iLen > iIter) {
            for (; iIter < iLen; iIter++) {
                bEval ? vParams += sDiv + 'oArgs[' + iIter + ']'
                      : vParams[vParams.length] = oArgs[iIter];
                sDiv = ', ';
            };
            fnCallBack = function () {
                return (bEval
                       ? eval('aFunc(' + vParams + ')')
                       : aFunc.apply(this, vParams));
            };
        };
        return fnOriginal(fnCallBack || aFunc, aDelay, aLang);
    };
};
Заменять стандартные методы придется каждый отдельно (возможно понадобится только один):
Code (JavaScript): скопировать код в буфер обмена
if (window.execScript) {
    XpandDelaySetter('setTimeout');
    XpandDelaySetter('setInterval');
}
Чтобы выяснить, в каких браузерах еще, кроме IE, может понадобится эта конструкция, возможно пригодится такой вариант:
Code (JavaScript): скопировать код в буфер обмена
// в начале кода программы:
window.setTimeout(function (aBool) {
                      if (typeof (aBool) != 'undefined') {
                          return false;
                      };
                      XpandDelaySetter('setTimeout');
                      XpandDelaySetter('setInterval');
                  }, 0, true);
Однако в таком случае любой другой вызов window.setTimeout/window.setInterval придется отложить до момента выполнения этой функции.
Итак, как в дальнейшем могут выглядеть вызовы setTimeout/setInterval:
Code (JavaScript): скопировать код в буфер обмена
window.setTimeout(window.open, 1000, 'about:blank', 'MyWindow', 'width=300,height=300');
window.setInterval(function (aDate) {
                       var currentDate = new Date,
                           differens = (currentDate - aDate) / 1000,
                           spentTime;
                       currentDate.setUTCHours(0);
                       currentDate.setUTCMinutes(0);
                       currentDate.setUTCSeconds(differens);
                       spentTime = currentDate.toUTCString().match(/\s\d\d:\d\d:\d\d\s/);
                       window.status = '    ' + spentTime;
                   }, 1000, new Date);
//
window.setTimeout(get, 1000, req.responseJS.res2);
Надеюсь, что все это может кому-то пригодиться...
Back to top
View user's profile Send private message Send e-mail
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Tue Nov 18, 2008 7:22 pm (спустя 1 год 3 месяца 21 день 11 часов 21 минуту)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «DOM:window.setTimeout/window.setInterval для IE. (обсуждение)»,
расположенную в форуме Разное :: JavaScript (18 Ноября 2008, 19:22).
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML