Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   FAQ Баги браузеров. (https://javascript.ru/forum/offtopic/33616-faq-bagi-brauzerov.html)

Gozar 10.04.2014 19:03

Цитата:

Сообщение от Octane
я только начинал верить в IE

Ахаха :)

nerv_ 11.04.2014 00:09

Цитата:

Сообщение от Octane
придется фиксить так

Не помню с какого осла, но майкрософт заявила, что не хочет отличатся от остальных браузеров по юзер-агенту. Так что теперь это одна из "фич" новых IE :)

Octane 11.04.2014 00:31

Короче тут обсуждали https://twitter.com/DmitryKorobkin/s...81153034596354
Если фиксить через new NOP, то возникает проблема: Object.create(null) instanceof Object → true, а так быть не должно, поэтому последний вариант:
//IE9-11 Object.create bug fix
(function () {
	var object = Object.create({});
	object[0] = null;
	return object.hasOwnProperty(0); //→ false in IE9-11
}()) || new function () {
	var create = Object.create;
	Object.create = function (prototype, properties) {
		//Object.defineProperties fixes a bug
		if (properties) {
			return create(prototype, properties);
		}
		//If Object.create works via new NOP, then
		//Object.create(null) instanceof Object → true,
		//but it's wrong.
		//https://twitter.com/WebReflection/status/454342010288078848
		if (prototype === null) {
			return create(null, {
				"": {
					configurable: true,
					writable: true
				}
			});
		}
		function NOP() {}
		NOP.prototype = prototype;
		return new NOP;
	};
};
да, теперь для Object.create(null), метод Object.getOwnPropertyNames будет возвращать лишнее пустое свойство, но лучше варианта пока не придумал.

devote 11.04.2014 12:00

А не проще тогда уж поправить hasOwnProperty
//IE9-11 Object.create bug fix
(function () {
    var object = Object.create({});
    object[0] = null;
    return object.hasOwnProperty(0); //> false in IE9-11
}()) || new function () {
    var hasOwnProperty = Object.prototype.hasOwnProperty;
    Object.prototype.hasOwnProperty = function(prop) {
      // если числовое свойство ищем
      return +prop == prop ?
            Object.getOwnPropertyNames(this).indexOf(""+prop) != -1 :
            hasOwnProperty.apply(this, arguments);
    };
};

Octane 11.04.2014 12:19

Тогда и getOwnPropertyDescriptor, и propertyIsEnumerable фиксить придется, может еще что-нибудь

Дзен-трансгуманист 11.04.2014 21:17

Баг интерфейса в FF28, замечен в винде:

Встроенный редактор JS иногда перестает исполнять код. Это бывает неочевидно, например, когда код чисто логический и не подразумевает каких-либо визуальных эффектов. Поэтому сопровождайте его хотя бы console.log, если ниче не логирует - лечится открыванием нового окна редактора.

kobezzza 11.04.2014 23:32

Дзен-трансгуманист, ты не сюда пости, а в баг-трекер мозиллы:)

nerv_ 12.04.2014 00:05

Цитата:

Сообщение от kobezzza
Дзен-трансгуманист, ты не сюда пости, а в баг-трекер мозиллы

Дзен-трансгуманист, не слушай его. Тогда тема будет неактуальна :D

devote 12.04.2014 03:09

Цитата:

Сообщение от Octane
Тогда и getOwnPropertyDescriptor, и propertyIsEnumerable фиксить придется, может еще что-нибудь

Ок, тогда не нужно никаких NOPов, все делается просто:
//IE9-11 Object.create bug fix
(function () {
    var object = Object.create({});
    object[0] = null;
    return object.hasOwnProperty(0); //> false in IE9-11
}()) || new function () {
    var create = Object.create;
    Object.create = function (prototype, properties) {
        var isExecNum = properties && Object.getOwnPropertyNames(properties).indexOf("0") != -1;

        if (!isExecNum) {
            properties = properties || {};
            /**
             * Нужно добавить именно числовое свойство, иначе не будет работать
             * например такой вариант не работает:
             *   var o = Object.create({}, {"": {configurable: true}});
             *   delete o[""];
             *   o[0] = null;
             *   o.hasOwnProperty(0) // -> false
             * но если вместо пустой строки поставить число, то все работает хорошо
             */
            properties["0"] = {
                configurable: true
            };
        }

        var object = create.call(this, prototype, properties);

        if (!isExecNum) {
            delete object["0"];
            delete properties["0"];
        }
        return object;
    };
};

Octane 12.04.2014 10:56

О это хорошо, теперь фикс ничем не помешает. Я думаю, можно не выполнять никаких проверок, кроме наличия properties:
//IE9-11 Object.create bug fix
(function () {
	var object = Object.create({});
	object[0] = null;
	return object.hasOwnProperty(0); //→ false in IE9-11
}()) || new function () {
	var create = Object.create;
	Object.create = function (prototype, properties) {
		var object;
		if (properties) {
			//Object.defineProperties fixes a bug
			object = create(prototype, properties);
		}
		else {
			//numeric key fixes a bug,
			//it can be removed after,
			//unlike alphabetic key
			object = create(prototype, {
				"0": {
					configurable: true
				}
			});
			delete object[0];
		}
		return object;
	};
};


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