| 
 Меня троллит джаваскрипт Имеется такая фабрика объектов: 
function $() {
	var res = $.proto;
	res.length = arguments.length;
	for ( var i = 0; i < arguments.length; i++ ) {
		res[i] = arguments[i];
	}
	return res;
}
$.proto = {};
Хочу переставить все объекты в обратном порядке, создаю метод, но при создании нового объекта this затирается! 
$.proto.reverse = function () { // здесь this нормальный (проверка алертом)
	var res = $(); // а здесь уже пустой $()
	for ( var i = 0; i < this.length; i++ ) {
		res[i] = this[this.length - i - 1];
	}
	res.length = this.length;
	return res;
};
$( 0, 1, 2, 3, 4, 5 ).reverse(); // в любом случае пустой $()
Почему создание нового $()-объекта затирает this? Причём есть идентичный по структуре метод extract, который достаёт элементы между позицией A и B: 
$.proto.extract = function ( from, to ) {
	var res = $();
	for ( var i = 0; i < to - from; i++ ) {
		res[i] = this[from + i];
	}
	res.length = to - from;
	return res;
};
$( 0, 1, 2, 3, 4, 5 ).extract( 2, 4 ); // возвращает объект $( 2, 3 )
И тут this не затирается, всё работает как надо. Тут так же создаю новый $(), вставляю элементы, а потом возвращаю $(e1, e2...) для дальнейшей работы. | 
| 
 Меня опять троллит джаваскрипт! 
Animate.color = function ( elem, attr, to, time ) {
	// поскольку на вход могут подать название цвета ("pink") или hex-значение (#ff69b4)
	// преобразуем его в rgb(205, 105, 180), заставив браузер вычислить его
	var I = document.createElement( "DIV" );
	I.style.backgroundColor = to;
	document.body.appendChild( I );
	var colorEnd = getComputedStyle( I ).backgroundColor.match( /(\w{1,3})/g ); // получаем [205, 105, 180]
	document.body.removeChild( I ); // убираемся за собой
	var colorStart = getComputedStyle( elem )[attr].match( /(\w{1,3})/g ); // начальный цвет элемента
	var start = new Date().getTime();
	setTimeout( function () {
		var diff = new Date().getTime() - start;
		if ( diff < time ) { // alert(diff) даёт 10
			elem.style[attr] = "rgb(" + A( colorStart[0], colorEnd[0], diff/time ) + ", " + A( colorStart[1], colorEnd[1], diff/time ) + ", " + A( colorStart[2], colorEnd[2], diff/time ) + ")";
			setTimeout( arguments.callee, 10 ); // НО НОВЫЙ SETTIMEOUT ПРОСТО НЕ ВЫЗЫВАЕТСЯ, ХОТЬ ТЫ ТРЕСНИ
		}
	}, 10 );
};
function A ( x, y, z ) { // вспом. ф-я для выч. from + (to - from) * (diff / time)
	return +x + (+y - +x) * +z;
}
Вызывается так: 
Animate.color( document.getElementById("foo"), "backgroundColor", "black", 1000 );
Причём есть аналогичная функция для изменения других параметров (ширина, высота и т.д.), там всё считается по той же формуле (from + (to - from) * (diff / time)) и работает как надо. | 
| 
 Починил вроде. Всем спасибо за помощь. 
( function () {
	var Anim = {};
	Anim.fxHelper = function ( elem, attr, to, dur ) {
		var from = getComputedStyle( elem )[attr];
		from = +from.replace( "px", "" );
		var start = new Date().getTime();
		var animation = function () {
			var m = (new Date().getTime() - start) / dur;
			if (m > 1) m = 1;
			elem.style[attr] = from + (to - from) * m;
			if (m < 1) setTimeout( animation, 10 );
		};
		setTimeout( animation, 10 );
	};
	Anim.fx = function ( elem, data, dur ) {
		for ( var i in data ) {
			if ( i.indexOf("olor") != -1 ) {
				Anim.color( elem, i, data[i], dur );
				continue;
			}
			Anim.fxHelper( elem, i, data[i], dur );
		}
	};
	Anim.color = function ( elem, attr, to, time ) {
		var I = document.createElement( "DIV" );
		I.style.backgroundColor = to;
		document.body.appendChild( I );
		var colorEnd = getComputedStyle( I ).backgroundColor.match( /(\d{1,3})/g );
		document.body.removeChild( I );
		var colorStart = getComputedStyle( elem )[attr].match( /(\d{1,3})/g );
		var start = new Date().getTime();
		var animation = function () {
			var m = (new Date().getTime() - start) / time;
			if (m > 1) m = 1;
			elem.style[attr] = 	"rgb(" + A( colorStart[0], colorEnd[0], m ) + ", " +
						A( colorStart[1], colorEnd[1], m ) + ", " +
						A( colorStart[2], colorEnd[2], m ) + ")";
			if (m < 1) setTimeout( animation, 10 );
		};
		setTimeout( animation, 10 );
	};
	function A ( x, y, z ) {
		x = +x;
		y = +y;
		return (x + (y - x) * z).toFixed(0);
	}
	window.Animate = Anim.fx;
})();
 | 
| 
 Цитата: 
 | 
| 
 Опять не получается. Пишу jQuery-подобную библиотеку, создаю методы: 
$.proto.import( {
	html : function ( content ) {
		return this.attr( "innerHTML", content );
	},
	val : function ( content ) {
		return this.attr( "value", content );
	},
	id : function ( content ) {
		return this.attr( "id", content );
	}
);
Всё работает, но это индусский код. У меня же там будет ещё и .href(), .name(), .title(), .src(), ну в общем все стандартные атрибуты. Решил сделать так: 
var attrs = {
	"html" : "innerHTML",
	"val" : "value",
	"href" : 0,
	"src" : 0
};
for ( var i in attrs ) {
	$.proto[ i ] = function ( content ) {
		return this.attr( attrs[i] || i, content );
	}
}
Но метод перестаёт работать. И что самое странное, если в attrs оставить только одну пару, например "html" : "innerHTML", то метод .html() начинает работать исправно! А если добавить пару "val" : "value" или любую другую, то он перестаёт работать. Стеснительный. | 
| 
 Опять какая-то шизофрения. Задача: сделать плагин explode (при клике элемент "разлетается" на части). План: - создать NxN ячеек с overflow=hidden (с этим проблем нет) - поместить туда копии элемента (вот здесь проблема) - сдвинуть маргинами, анимировать Никак не могу поместить копии элемента в ячейки. Если поставить var tileContent = elem.outerHTML; (восьмая строчка в коде), то оригинальный элемент чудесным образом не удаляется, а в ячейки не добавляются! Если же вместо outerHTML поставить innerHTML, то всё работает, но стили оригинального элемента теряются, чего допустить нельзя. cloneNode не помогает, эффект такой же, как с outerHTML. 
function Explode( elem, num ) {
	num = num || 3; // num*num ячеек
	var pos = elem.getBoundingClientRect();
	var top = pos.top;
	var left = pos.left;
	var width = Math.round( elem.clientWidth / num );
	var height = Math.round( elem.clientHeight / num );
	var tileContent = elem.outerHTML;
	elem.parentNode.removeChild( elem );
	for ( var i = 0; i < num; i++ ) {
		for ( var j = 0; j < num; j++ ) {
			var tile = document.createElement( "DIV" );
			document.body.appendChild( tile );
			tile.style.position = "fixed";
			tile.style.width = width;
			tile.style.height = height;
			tile.style.top = top + height * i;
			tile.style.left = left + width * j;
			tile.style.border = "1px solid #000000";
			tile.style.overflow = "hidden";
			tile.innerHTML = tileContent;
		}
	}
}
UPD: этот глюк только если у оригинального элемента position=fixed. | 
| 
 Diphenyl Oxalate,Разрезать картинку | 
| 
 Цитата: 
 | 
| 
 Цитата: 
 | 
| 
 Цитата: 
 А мне надо разрезать элемент вне зависимости от position. | 
| Часовой пояс GMT +3, время: 22:15. |