Вероятнее всего — это баг. Потому как наблюдаю ПОЛНУЮ магию, например вот такое в 3.5 иногда работает (в зависимости от того, что будет выполняться):
thread.onreadystatechange = function () {
/*thread.onreadystatechange = function () { };*/
process.call(context);
/* Magick! */
};
Наличие /* Magick! */ — обязательное условие! В 3.6 не работает вообще. |
странно.. фокс же вырезает комменты при парсинге..
|
Я понимаю, что бред, но почему то именно если коммента в конце нет — не работает.
Костыль с rethrow работает только в FF до 3.6, в 3.6 же ошибки даже в нём съедаются! Вырубил Firebug и Console² — rethrow работает. |
Проблема была в Console²
|
postMessage пробовали? (там, где он есть, разумеется)
З.Ы. Хотя не, он же асинхронный будет. |
забавная зависимость о_0"
|
Зависимость между чем?
|
а, я тупой.. не обращайте внимание ^^'
|
Ну если вдруг нужны будут асинхронные "потоки", то postMessage быстрее setTimeout(0).
|
там некорректный тест. сначала засекается время, потом браузер перерисовывает страницу, а потом только начинается выполнение второго теста.
|
Да вроде нет, сначала рендерим, потом засекаем второй раз.
var endTime = Date.now();
printOutput("100 iterations of setZeroTimeout took " + (endTime - startTime) + " milliseconds.");
i = 0;
startTime = Date.now();
setTimeout(test2, 0);
|
Там где есть postMessage (а это, я так понимаю, FF, Chrome, Safari) можно сделать ещё проще — навесить на window свой кастомный эвент и будет работать как надо
|
Цитата:
|
Объясните мне тупому, почему все же отказались от решения с 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);
|
потому что не работает в ие
|
Цитата:
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 добавить метод. |
Цитата:
Цитата:
var fragment = document.createDocumentFragment();
var node = document.createElement('div');
node.attachEvent('onpropertychange', function(){
alert('Property change');
});
fragment.appendChild(node);
node.fireEvent('onpropertychange', document.createEventObject());
|
Цитата:
Цитата:
UPD: афигеть, даже без attachEvent можно:
var elem = $d.createElement('div');
$d.createDocumentFragment().appendChild(elem);
elem.onclick = handler;
elem.fireEvent('onclick', $d.createEventObject());
моя счастлив :) . |
Цитата:
Даже не пытайтесь переубедить. Цитата:
var fragment = document.createDocumentFragment();
var node = document.createElement('div');
node.attachEvent('onpropertychange', function(){
alert('Property change');
});
fragment.appendChild(node);
node.innerHTML = '';
А вот если поместить его в документ, то всё ок. Осталось только слить 2 скрипта вместе и готово. |
Цитата:
Цитата:
|
Цитата:
for..in... Так то никто никому не запрещает, только советовать не надо. |
Цитата:
|
Цитата:
|
Цитата:
Просто for..in - это не агрумент против расширения прототипов стандартных объектов. По-моему, истинное зло - это использование for..in без hasOwnProperty ( я лично предпочитаю Object.keys( object ).forEach - мне так кайфовее:) ). |
Цитата:
Цитата:
function Conctructor(options){
// Инициализация
}
Категорически запрещается использовать hasOwnProperty при проверки значений, т.к. объект options может наследовать от других объектов. Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Проверять надо тип значения, если чо. Это вообще отдельная тема. UPD: Цитата:
|
B~Vladi, В твоих сообщениях ко мне (в этой теме) как-то дофига негатива (может мне кажется?), и мне это совершенно непонятно...
UPD: И вообще, твой пример никак не связан с циклом for..in!
function Conctructor(options){
for(var prop in options) switch(prop){
case 'some': ...
}
...
Сомневаюсь, что так кто-нибудь (адекватный) будет делать. |
B~Vladi,
тебя спрашивают, почему плохо расширять Function.prototype, а ты объясняешь, почему плохо расширять Object.prototype. Так в Object.prototype никто и не лезет. |
Sweet, прости, я норм к тебе отношусь.
Цитата:
var defaultOptions = {};
function Constructor(options){
for(var property in defaultOptions){
if(defaultOptions.hasOwnProperty(property)){ // Проверяем только нужные свойства. Вот здесь hasOwnProperty обязательно.
// Делаем нужные действия
}
}
}
Когда нет дефолтных значений, проверять нужно так:
function Constructor(options){
// Допустим, нам нужно проверить конкретное свойство
// Если тип не важен:
if('prop' in options){}
// Если важен:
if('prop' in options && (/* тут проверка типа */)){} // prop in obj - тоже обязательно
}
Но никак не hasOwnProperty! Его нужно использовать только для "своих" объектов и то, если они не имеют кастомных прототипов. Из этого видно, что значением может оказаться ваше кастомное свойство из прототипа. Цитата:
Что я этим хотел сказать: Если везде применять hasOwnProperty и проверять тип объекта - создаются ограничения, в частности, нельзя уже использовать наследование. Если расширять прототипы нативных конструкторов - они начинают везде обрабатываться, что может привести назад к использованию hasOwnProperty или даже к багу. Замкнутый круг. В каком месте его разрывать - каждый решает сам для себя, о чем я писал выше. Все полюсы и минусы я показал. |
Насколько я понял, это выглядет примерно так:
function SomeConstructor( object ){
this.property1 = object.property1 || 'default';
this.property2 = object.property2 || 'default';
};
var func = function(){};
func.property1 = 'value';
Function.prototype.property2 = 'zapadlo';
new SomeConstructor( func ); // Тысяча чертей, почему property2 не 'default'???
Но для себя я решил, что имею полное право дополнять нативные конструкторы там, где считаю нужным. Что плохого в том, что я, например, добавляю в Array.prototype методы forEach, filter и пр.? Я, конечно, понимаю про for..in, но мы же знаем, как зовут тех, кто так переберает массивы?:) |
Расширение Array.prototype, Function.prototype и т.д. менее опасно только из-за того, что их экземпляры используются в основном по назначению, а не для хранения/передачи свойств. forEach и filter это, конечно же, хорошо, но только потому что они есть в спецификации и в реализациях, поэтому безопасно.
|
Вот как-то так получилось:
Function.prototype.callAsync = function() {
var self = this, args = $A(arguments), thisObj = args.shift(), elem = document.createElement('div'), done = false;
elem.onclick = function() {
if (!done) {
done = true;
self.apply(thisObj, args);
}
};
if (document.createEvent) {
var e = document.createEvent('HTMLEvents');
e.initEvent('click', false, false);
elem.dispatchEvent(e);
} else document.createDocumentFragment().appendChild(elem).fireEvent('onclick', document.createEventObject());
if (!done) setTimeout(elem.onclick, 15);
};
var $A = function(iterable) {
if (iterable) {
var result = [], i = iterable.length;
while (i) result[--i] = iterable[i];
return result;
}
return [];
};
var testFunc = function() {
alert('testFunc');
throw new Error('testFunc');
};
testFunc.method();
alert('global');
testFunc.method();
alert('global');
|
Цитата:
|
Цитата:
|
Но при этом мы знаем, что не надо перебирать массивы с помощью for-in, поэтому не боимся дописывать forEach/map/filter/... .
|
B~Vladi, ты прав, если неадекватные пользователи входят в целевую аудиторию решения (jquery way?), но все может быть проще :)
ссылка по смежной теме: What’s wrong with extending the DOM |
|
намекаешь на дефолтную реализацию исполнения ф-й в отдельных потоках?
|
| Часовой пояс GMT +3, время: 19:08. |