Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   FTread, исполнение функций в отдельных потоках (https://javascript.ru/forum/project/7558-ftread-ispolnenie-funkcijj-v-otdelnykh-potokakh.html)

Kolyaj 25.03.2010 18:07

Да вроде нет, сначала рендерим, потом засекаем второй раз.
var endTime = Date.now();
printOutput("100 iterations of setZeroTimeout took " + (endTime - startTime) + " milliseconds.");
i = 0;
startTime = Date.now();
setTimeout(test2, 0);

artyv 25.03.2010 20:39

Там где есть postMessage (а это, я так понимаю, FF, Chrome, Safari) можно сделать ещё проще — навесить на window свой кастомный эвент и будет работать как надо

tenshi 25.03.2010 21:14

Цитата:

Да вроде нет, сначала рендерим, потом засекаем второй раз.
рендеринг происходит после выхода из одного потока и до входа в следующий

Riim 22.04.2011 04:49

Объясните мне тупому, почему все же отказались от решения с dispatchEvent ?

У меня следующий код вроде везде работает (кроме IE конечно):
var elem = document.createElement('div');
elem.onclick = function(e) {
	alert('Ok!');
};
var e = document.createEvent('HTMLEvents');
e.initEvent('click', false/* bubbles */, false/* cancelable */);
elem.dispatchEvent(e);

tenshi 22.04.2011 09:41

потому что не работает в ие

Riim 22.04.2011 10:42

Цитата:

Сообщение от tenshi
потому что не работает в ие

для IE у меня еще такой вариант получился:
var xmlDoc = new ActiveXObject('Microsoft.XMLDOM'), done = false;
xmlDoc.onreadystatechange = function() {
    if (!done) {
        done = true;
        alert('Ok!');
    }
};
xmlDoc.loadXML('');


но он медленный гад :( . done нужен потому-что событие срабатывает много раз и всякие this.onreadystatechange = null и xmlDoc.abort() его не отменяют.

tenshi, а зачем нужна фабрика, не проще сразу вызывать переданную функцию? Можно даже в Function.prototype добавить метод.

B~Vladi 22.04.2011 11:34

Цитата:

Сообщение от Riim
Можно даже в Function.prototype добавить метод.

:nono:

Цитата:

Сообщение от Riim
но он медленный гад

Подойдет?!
var fragment = document.createDocumentFragment();
var node = document.createElement('div');
node.attachEvent('onpropertychange', function(){
	alert('Property change');
});
fragment.appendChild(node);
node.fireEvent('onpropertychange', document.createEventObject());

Riim 22.04.2011 11:52

Цитата:

Сообщение от B~Vladi
:nono:

а что так?


Цитата:

Сообщение от B~Vladi
Подойдет?!

Супер! Тоже что-то с DocumentFragment пробовал, но у меня почему-то не заработало :( .

UPD: афигеть, даже без attachEvent можно:
var elem = $d.createElement('div');
$d.createDocumentFragment().appendChild(elem);
elem.onclick = handler;
elem.fireEvent('onclick', $d.createEventObject());

моя счастлив :) .

B~Vladi 22.04.2011 11:59

Цитата:

Сообщение от Riim
а что так?

Великое зло :)
Даже не пытайтесь переубедить.

Цитата:

Сообщение от Riim
Тоже что-то с DocumentFragment пробовал, но у меня почему-то не заработало

Интересно, что этот код работает только в ИЕ8:
var fragment = document.createDocumentFragment();
var node = document.createElement('div');
node.attachEvent('onpropertychange', function(){
	alert('Property change');
});
fragment.appendChild(node);
node.innerHTML = '';

А вот если поместить его в документ, то всё ок.

Осталось только слить 2 скрипта вместе и готово.

Riim 22.04.2011 12:06

Цитата:

Сообщение от B~Vladi
Великое зло

не хочешь рассказывать почему, злодей! :)


Цитата:

Сообщение от B~Vladi
Интересно, что этот код работает только в ИЕ8

ага, вот именно так я и пробовал, но тестил в IE6.


Часовой пояс GMT +3, время: 20:13.