<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CTAPbIu_MABP&#039;s BLOG &#187; jquery</title>
	<atom:link href="http://mabp.kiev.ua/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>энтузиазм = 1/опыт © Старый Мавр</description>
	<lastBuildDate>Sat, 12 May 2012 07:40:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>О $.ajax.context</title>
		<link>http://mabp.kiev.ua/2012/01/26/about-jquery-ajax-context/</link>
		<comments>http://mabp.kiev.ua/2012/01/26/about-jquery-ajax-context/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 10:32:54 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1390</guid>
		<description><![CDATA[Вроде удобно сделали, теперь можно задать контекст для метода success, теперь вместо $.ajax({ url: "...", success: function(){ $("#myTemplate").tmpl(data).appendTo($("#myContainer").empty()); } }); можно удобно писать $.ajax({ url: "...", context: $("#myContainer").empty(), success: function(){ $("#myTemplate").tmpl(data).appendTo(this); } }); только это все разбивается о рифы реальности, когда аджакс надо повесить на кнопку $("#myButton").click(function(){ $.ajax({ url: "...", context: $("#myContainer").empty(), success: function(){ $("#myTemplate").tmpl(data).appendTo(this); [...]]]></description>
			<content:encoded><![CDATA[<p>Вроде удобно сделали, теперь можно задать контекст для метода success, теперь вместо </p>
<span id="more-1390"></span>
<pre><code class="javascript">
$.ajax({
	url: "...",
	success: function(){
		$("#myTemplate").tmpl(data).appendTo($("#myContainer").empty());
	}
});
</code></pre>

<p>можно удобно писать</p>

<pre><code class="javascript">
$.ajax({
	url: "...",
	context: $("#myContainer").empty(),
	success: function(){
		$("#myTemplate").tmpl(data).appendTo(this);
	}
});
</code></pre>

<p>только это все разбивается о рифы реальности, когда аджакс надо повесить на кнопку</p>
<pre><code class="javascript">
$("#myButton").click(function(){
	$.ajax({
		url: "...",
		context: $("#myContainer").empty(),
		success: function(){
			$("#myTemplate").tmpl(data).appendTo(this);
		}
	});
});
</code></pre> 

<p>При трех быстрых кликах, контейнер три раза обнуляется, потом идет запрос/ответ и шаблон три раза вставляется в контейнер.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2012/01/26/about-jquery-ajax-context/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Как закрыть диалог</title>
		<link>http://mabp.kiev.ua/2012/01/17/how-to-close-dialog/</link>
		<comments>http://mabp.kiev.ua/2012/01/17/how-to-close-dialog/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 23:50:41 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>
		<category><![CDATA[Modal Dialog]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1386</guid>
		<description><![CDATA[Представьте что у вас на странице есть 5 разных диалогов, они могут быть открыты в любой последовательности но два сразу открытыми быть не могут. Значит надо закрывать все открытые, но как их ывыбрать, не хранить же 5 ссылок на диалоги. Первый пришедший в голову вариант был прост как двери $("#dialog1","#dialog2","#dialog3","#dialog4","#dialog5").dialog("close"); но если хотя бы один [...]]]></description>
			<content:encoded><![CDATA[<p>Представьте что у вас на странице есть 5 разных диалогов, они могут быть открыты в любой последовательности но два сразу открытыми быть не могут. Значит надо закрывать все открытые, но как их ывыбрать, не хранить же 5 ссылок на диалоги.</p>
<span id="more-1386"></span>
<p>Первый пришедший в голову вариант был прост как двери</p>

<pre><code class="javascript">
$("#dialog1","#dialog2","#dialog3","#dialog4","#dialog5").dialog("close");
</code></pre>

<p>но если хотя бы один диалог не был создан при старте страницы то вылетит Exception. Естественно создавать диалоги при старте бессмысленно. ни один может не понадобиться а ресурсов они отъедают нормально. Второй вариант был таким</p>

<pre><code class="javascript">
for (var i=1,j=5;i&lt;j;i++){
	try{
		$("#dialog"+i).dialog("close");
	}catch(e){
		// do nothing
	}
}
</code></pre>

<p>и несколько дней эта конструкция муляла мне глаза. Наконец я переписал это примерно так</p>

<pre><code class="javascript">
for (var i=1,j=5,d;i&lt;j;i++){
	d = $("#dialog"+i);
	if(d.data("dialog")){
		d.dialog("close");
	}
}
</code></pre>

<p>стало лучше но еще не совершенно, последним вариантом стало</p>

<pre><code class="javascript">
$("div:data(dialog)").dialog("close");
</code></pre>

<p>теперь я доволен, а какие еще есть варианты?</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2012/01/17/how-to-close-dialog/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>jQuery UI: Tabs below content</title>
		<link>http://mabp.kiev.ua/2011/11/10/jquery-ui-tabs-below-content/</link>
		<comments>http://mabp.kiev.ua/2011/11/10/jquery-ui-tabs-below-content/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 10:25:05 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1382</guid>
		<description><![CDATA[Похоже открывается очередной сезон этого блога. И вот я вчера приготовил статью про табики, я всего лишь хотел сделать их снизу, и выложить пример даже без объяснения, но все серьезно затянулось и сейчас вам предстоит прочитать достаточно много текста. Как обычно примера из официального мануала мне не достаточно поэтому начал хачить. Собственно то что мне [...]]]></description>
			<content:encoded><![CDATA[<p>Похоже открывается очередной сезон этого блога. И вот я вчера приготовил статью про табики, я всего лишь хотел сделать их снизу, и выложить пример даже без объяснения, но все серьезно затянулось и сейчас вам предстоит прочитать достаточно много текста.</p>

<span id="more-1382"></span>

<p>Как обычно примера из <a href="http://jqueryui.com/demos/tabs/#bottom" rel="nofollow external">официального мануала</a> мне не достаточно поэтому начал хачить. Собственно то что мне надо было находиться в низу страницы, а как я его делал я расскажу сейчас.</p>

<p>Основная идея примера из мануала: чтобы на одной и той же разметке можно было сделать табики и сверху и снизу. Это очень хорошая идея но мне явно не подходила. Вкратце табики выглядят так: общий контейнер, в нем сверху UL с закладками, снизу - DIV с контентом. Это верно как для разметки так и для отображения. Для табиков снизу разметка та же, но табики имеют position:absolute и bottom:0 . Казалось бы все должно работать, НО есть одно НО, и это не IE! Это как не странно WebKit. Все размерности в JQuery UI указаны в EM, что бы все одинаково хорошо смотрелось с любым размером текста, так вот при переходе из EM (да в общем и из остальных относительных величин) в PX, WebKit  округляет числа в большую сторону, тогда как все остальные в меньшую, или подгоняют. Об этом еще <a href="http://ejohn.org/blog/sub-pixel-problems-in-css/" rel="nofollow external">Resig</a> писал в далеком 2008 году. При таком подходе прижатые к низу табики налазят на текст на 1-2PX. Это совершенно не волнует пример в мануале, потому что текст там не имеет бордера и заранее короче на несколько пикселей, так что между ним и прижатыми табами есть зазор. Ради красоты пришлось пожертвовать первоначальной разметкой, перенеся табики под текст. Хотя по моему вообще это не принципиально, потому что я сделал это скриптом, да и вернуть их тоже не проблема.</p>

<p>Вторая проблема это !important. <a href="http://teambook.ru/approaches/the-ezhupa" rel="nofollow external">ежупанятна</a> что универсальность в таком большом CSS framework требует перекрывать что-то, что было написано позже, тем что было написано раньше. Тут кроется проблема всего framework. Я свято уверен что классы типа ui-state-[default|hover|active] не должны определять толщину и тип бордера, а только цвет, потому что потом надо городить огороды. В своем маленьком примере я это поправил. </p>

<p>Ну и последние, надо открывать таб по урлу. Как бы самое обычное дело, но предусмотрено в документации только через куки, а если руками указывать то надо знать индекс таба а не скажем его ID. С этой маленькой гадкой проблемой я тоже очень элегантно справился двумя строками кода.</p>


<link rel="stylesheet" type="text/css" media="screen" href="/content/css/jquery-ui-tabs-below-content.css"/>
<script type="text/javascript" src="/content/js/jquery-ui-tabs-below-content.js"></script>

<div id="tabs" class="tabs-bottom">
	<ul>
		<li><a href = "#tabs-1">1</a></li>
		<li><a href = "#tabs-2">2</a></li>
		<li><a href = "#tabs-3">3</a></li>
		<li><a href = "#tabs-4">4</a></li>
		<li><a href = "#tabs-5">5</a></li>
	</ul>
	<div id="tabs-1">
		<h1>1</h1>
	</div>
	<div id="tabs-2">
		<h1>2</h1>
	</div>
	<div id="tabs-3">
		<h1>3</h1>
	</div>
	<div id="tabs-4">
		<h1>4</h1>
	</div>
	<div id="tabs-5">
		<h1>5</h1>
	</div>
</div>

<p>KISS</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2011/11/10/jquery-ui-tabs-below-content/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Плавающий текст</title>
		<link>http://mabp.kiev.ua/2011/03/21/floating-text/</link>
		<comments>http://mabp.kiev.ua/2011/03/21/floating-text/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 14:06:00 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1332</guid>
		<description><![CDATA[Вот такая анимация у меня родилась ЖОПА]]></description>
			<content:encoded><![CDATA[<p>Вот такая анимация у меня родилась</p>

<span id="more-1332"></span>

<link rel="stylesheet" type="text/css" media="screen" href="/content/css/floating-text.css"/>
<script type="text/javascript" src="/content/js/floating-text.js"></script>

<div id="float">ЖОПА</div>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2011/03/21/floating-text/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>jQuery UI: RangePicker</title>
		<link>http://mabp.kiev.ua/2010/12/21/jquery-ui-rangepicker/</link>
		<comments>http://mabp.kiev.ua/2010/12/21/jquery-ui-rangepicker/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 11:03:43 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1318</guid>
		<description><![CDATA[Сегодня у меня выдался свободный день поэтому расскажу вам как выбрать период на стандартном jquery datepicker Поскольку офицальный пример - гавно, делать все надо самим. Сначала немного подхачим jQuery UI, вот таким образом (function(){ var old_selectDate = $.datepicker.constructor.prototype._selectDate; // forget about this /* Update the input field with the selected date. */ $.datepicker.constructor.prototype._selectDate = function(id, [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня у меня выдался свободный день поэтому расскажу вам как выбрать период на стандартном jquery datepicker</p>
<span id="more-1318"></span>

<script type="text/javascript" src="/content/js/jquery-ui-rangepicker.js"></script>  

<p>Поскольку офицальный пример - <a href="http://jqueryui.com/demos/datepicker/date-range.html" rel="nofollow external">гавно</a>, делать все надо самим.</p>
<p>Сначала немного подхачим jQuery UI, вот таким образом</p>
<pre><code class="javascript">
(function(){
	var old_selectDate = $.datepicker.constructor.prototype._selectDate; // forget about this
	
	/* Update the input field with the selected date. */
	$.datepicker.constructor.prototype._selectDate = function(id, dateStr) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
		
		var onSelect = this._get(inst, 'onSelect');
		if (onSelect &#038;& false === onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst])){
			return;
		}
		
		if (inst.input){
			inst.input.val(dateStr);
			inst.input.trigger('change'); // fire the change event
		}
		this._updateAlternate(inst);
		
		if (inst.inline)
			this._updateDatepicker(inst);
		else {
			this._hideDatepicker();
			this._lastInput = inst.input[0];
			if (typeof(inst.input[0]) != 'object')
				inst.input.focus(); // restore focus
			this._lastInput = null;
		}
	}

})();
</code></pre>

<p>Как видете я добавил небольшую проверку на возврат коллбэка onSelect, теперь если он возвращает false то значение инпуту не присваиваеться. Это не должно мешать обычной работе календаря.</p>

<p>Дальше конфигурируем сам календарь, значение настроек смотрите в мануале</p>

<pre><code class="javascript">
jQuery(document).ready(function($){

	var click = 1, from = new Date, to = new Date;
	$("[name=from], [name=to]").datepicker({
		numberOfMonths: 2,
		minDate : new Date("12/01/2010"),
		maxDate : new Date("01/31/2011"),
		dateFormat: "dd/mm/yy",
		showButtonPanel: true,
		closeText : "Применить",
		onSelect: function( selectedDate ) {
			var format = $(this).data("datepicker").settings.dateFormat || $.datepicker._defaults.dateFormat,
				date = $.datepicker.parseDate(format, selectedDate);
			if (click++%2){
				from = date;
				to = date;
			} else {
				if (date &lt; from){
					from = date;
				} else {
					to = date;
				}
			}
			$(this).datepicker("refresh");
			return false;
		},
		beforeShowDay : function(date){
			if (date &gt;= from &#038;& date &lt;= to){
				return [true, "ui-state-highlight"];
			}

			return [true, ""];
		},
		beforeShow : function(input, inst){
			var format = inst.settings.dateFormat || $.datepicker._defaults.dateFormat
			from = $.datepicker.parseDate(format, $("[name=from]").val());
			to = $.datepicker.parseDate(format, $("[name=to]").val());
		},
		onClose: function(dateText, inst) {
			if (inst.dpDiv.find(".ui-datepicker-close").is(".ui-state-hover")){
				var format = inst.settings.dateFormat || $.datepicker._defaults.dateFormat
				$('[name=from]').val($.datepicker.formatDate(format, from));
				$('[name=to]').val($.datepicker.formatDate(format, to));
			}
		}
	});
		
});
</code></pre>

<p>А вот и пример</p>

<div style="text-align:center;">
	<input name="from" value="20/12/2010"/>
	<input name="to" value="10/01/2011"/>
</div>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/12/21/jquery-ui-rangepicker/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>jQuery UI: fullscreen button for Dialog</title>
		<link>http://mabp.kiev.ua/2010/12/15/jquery-ui-fullscreen-button-for-dialog/</link>
		<comments>http://mabp.kiev.ua/2010/12/15/jquery-ui-fullscreen-button-for-dialog/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 18:56:13 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1316</guid>
		<description><![CDATA[Сегодня небольшой энчант для диалога - добавление кнопки развернуть на весь экран, хотя конечно не на весь экран а только на весь вьюпорт. Вот такой небольшой код добавляет новую кнопку в заголовок диалога. При первом нажатии на кнопку диалог разворачивается, при втором - сворачивается до первоначального размера. Ручной ресайз на кнопку никак не влияет. .ui-dialog [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня небольшой энчант для диалога - добавление кнопки развернуть на весь экран, хотя конечно не на весь экран а только на весь вьюпорт.</p>
<span id="more-1316"></span>

<link rel="stylesheet" type="text/css" media="screen" href="/content/css/jquery-ui-fullscreen-button-for-dialog.css"/>
<script type="text/javascript" src="/content/js/jquery-ui-fullscreen-button-for-dialog.js"></script>   

<p>Вот такой небольшой код добавляет новую кнопку в заголовок диалога. При первом нажатии на кнопку диалог разворачивается, при втором - сворачивается до первоначального размера. Ручной ресайз на кнопку никак не влияет. </p>
<pre><code class="css">
.ui-dialog .ui-dialog-titlebar-full {
	position: absolute;
	right: 2em;
	top: 50%;
	width: 19px;
	margin: -10px 0 0 0;
	padding: 1px;
	height: 18px;
}

.ui-dialog .ui-dialog-titlebar-full span {
	display: block;
	margin: 1px;
}

.ui-dialog .ui-dialog-titlebar-full:hover,
.ui-dialog .ui-dialog-titlebar-full:focus {
	padding: 0;
}
</code></pre>
<pre><code class="javascript">
(function(){
	var old = $.ui.dialog.prototype._create;
	$.ui.dialog.prototype._create = function(d){
		old.call(this, d);
		var self = this,
			options = self.options,
			oldHeight = options.height,
			oldWidth = options.width,
			uiDialogTitlebarFull = $('&lt;a href="#"&gt;&lt;/a&gt;')
				.addClass(
					'ui-dialog-titlebar-full ' +
					'ui-corner-all'
				)
				.attr('role', 'button')
				.hover(
					function() {
						uiDialogTitlebarFull.addClass('ui-state-hover');
					},
					function() {
						uiDialogTitlebarFull.removeClass('ui-state-hover');
					}
				)
				.toggle(
					function() {
						self._setOptions({
							height : window.innerHeight - 10,
							width : window.innerWidth - 30
						});
						self._position('center');
						return false;
					},
					function() {
						self._setOptions({
							height : oldHeight,
							width : oldWidth
						});
						self._position('center');
						return false;
					}
				)
				.focus(function() {
					uiDialogTitlebarFull.addClass('ui-state-focus');
				})
				.blur(function() {
					uiDialogTitlebarFull.removeClass('ui-state-focus');
				})
				.appendTo(self.uiDialogTitlebar),

			uiDialogTitlebarFullText = $('&lt;span&gt;&lt;/span&gt;')
				.addClass(
					'ui-icon ' +
					'ui-icon-newwin'
				)
				.text(options.fullText)
				.appendTo(uiDialogTitlebarFull)

	};
})();
</code></pre>

<p>Диалог принимает новую опцию options.fullText с текстом кнопки.</p>
<p>И еще для любителей пооптимизировать: _setOptions нельзя совместить с _position потому что позиционирование выполняется раньше ресайза, как ни странно.</p>



<div style="text-align:center;">
<input type="button" value="Тыцалка!" id="showDialog"/>
</div>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/12/15/jquery-ui-fullscreen-button-for-dialog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery.data</title>
		<link>http://mabp.kiev.ua/2010/12/09/jquery-data/</link>
		<comments>http://mabp.kiev.ua/2010/12/09/jquery-data/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 21:35:42 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1315</guid>
		<description><![CDATA[Аккела промахнулся рас и ноль jQuery(document).ready(function($){ var div = document.createElement("div"); div.setAttribute("data-attr","1111111111111111111111111111111") document.body.appendChild(div); console.log("getAttribute", div.getAttribute("data-attr")); console.log("jquery.data", $(div).data("attr")); div.parentNode.removeChild(div); }); Потому что в 1.4.4 в строке 1311 есть проверка которая проходит казалось бы правильно, да не очень data = data === "true" ? true : data === "false" ? false : data === "null" ? null : [...]]]></description>
			<content:encoded><![CDATA[<p>Аккела промахнулся <a href="http://bugs.jquery.com/ticket/7742" rel="nofollow external">рас</a> и <a href="http://bugs.jquery.com/ticket/7579" rel="nofollow external">ноль</a></p>
<span id="more-1315"></span>
<pre><code class="javascript">
jQuery(document).ready(function($){

	var div = document.createElement("div");
	div.setAttribute("data-attr","1111111111111111111111111111111")
	document.body.appendChild(div);

	console.log("getAttribute", div.getAttribute("data-attr"));
	console.log("jquery.data", $(div).data("attr"));

	div.parentNode.removeChild(div);

});
</code></pre>

<p>Потому что в 1.4.4 в строке 1311 есть проверка которая проходит казалось бы правильно, да не очень</p>

<pre><code class="javascript">
data = data === "true" ? true :
data === "false" ? false :
data === "null" ? null :
!jQuery.isNaN( data ) ? parseFloat( data ) : // <- here it is
	rbrace.test( data ) ? jQuery.parseJSON( data ) :
	data;
</code></pre>

]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/12/09/jquery-data/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Как дебажить анимацию</title>
		<link>http://mabp.kiev.ua/2010/11/29/how-to-debug-animation/</link>
		<comments>http://mabp.kiev.ua/2010/11/29/how-to-debug-animation/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 17:22:22 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1297</guid>
		<description><![CDATA[Дебажить анимацию дело геморрное но нужное. Пост про дебаг поэтому включите, плз, консольку. Когда надо затормозить анимацию где-то посередине, я обычно пишу в консоли что-то вроде setInterval(function(){$(':animated').stop();},500); Но бывает что этого недостаточно тогда в ход идет такой код $("#id").animate({/**/},{ step:function(){ console.log(arguments) } }); Как он работает можно посмотреть на примере анимаций backgroundColor и borderColor backgroundColor [...]]]></description>
			<content:encoded><![CDATA[<p>Дебажить анимацию дело геморрное но нужное.</p>

<span id="more-1297"></span>

<link rel="stylesheet" type="text/css" media="screen" href="/content/css/how-to-debug-animation.css"/>
<script type="text/javascript" src="/content/js/how-to-debug-animation.js"></script>


<p>Пост про дебаг поэтому включите, плз, консольку.</p>

<p>Когда надо затормозить анимацию где-то посередине, я обычно пишу в консоли что-то вроде</p>

<pre><code class="javascript">
setInterval(function(){$(':animated').stop();},500);
</code></pre>

<p>Но бывает что этого недостаточно тогда в ход идет такой код</p>

<pre><code class="javascript">
$("#id").animate({/**/},{
	step:function(){
		console.log(arguments)
	}
});
</code></pre>

<p>Как он работает можно посмотреть на примере анимаций backgroundColor и borderColor</p>

<div class="examples">
	<div id="example1" style="background-color:#0000ff;width:100px;height:100px;"></div>
	<div id="example2" style="border:50px solid  #0000ff;width:   0px;height:   0px;"></div>
	<div>backgroundColor</div>
	<div>borderColor</div>
</div>

<p>Вот такая нелепость и хуй пойми почему....</p>

<p>ЗЫ для тех кто читает через ридер - нелепость в том что анимация бэкграунда начинается всегда с текущего цвета, а бордера - с белого :(</p>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/11/29/how-to-debug-animation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lavalamp</title>
		<link>http://mabp.kiev.ua/2010/11/27/lavalamp/</link>
		<comments>http://mabp.kiev.ua/2010/11/27/lavalamp/#comments</comments>
		<pubDate>Sat, 27 Nov 2010 16:06:10 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1308</guid>
		<description><![CDATA[Незнаю в силу каких обстоятельств сложилось что при поиске данного эффекта все ссыки рано или позно заканчиваються тут. Возможно потому что этот плагин был первым, возможно потому что потому что эффект действительно похож на лавовую лампу. В обoем это не важно моя статья тоже веден на этот плагин ;) Так вот есть у этого плагина [...]]]></description>
			<content:encoded><![CDATA[<p>Незнаю в силу каких обстоятельств сложилось что при поиске данного эффекта все ссыки рано или позно заканчиваються <a href="http://www.gmarwaha.com/blog/2007/08/23/lavalamp-for-jquery-lovers/" rel="nofollow external">тут</a>. Возможно потому что этот плагин был первым, возможно потому что потому что эффект действительно похож на лавовую лампу. В обoем это не важно моя статья тоже веден на этот плагин ;)<p>

<span id="more-1308"></span>

<link rel="stylesheet" type="text/css" media="screen" href="/content/css/lavalamp.css"/>
<script type="text/javascript" src="/content/js/lavalamp.js"></script>


<p>Так вот есть у этого плагина большой недостаток - он однострочный и все похожие плагины тоже, тоесть если у меня менюшка в две строки то хрен мне. Надо было срочно исправить недоразумение и я написал свой.<p>

<ul id="lavalamp" class="ui-corner-all">
<li style="top:60px;left:20px" class="active"><span class="text">Один</span></span></li>
<li style="top:40px;left:150px"><span class="text">Два</span></li>
<li style="top:10px;left:50px"><span class="text">Три</span></li>
<li style="top:60px;left:100px"><span class="text">Четыре</span></li>
<li style="top:120px;left:10px"><span class="text">Пять</span></li>
<li style="top:10px;left:150px"><span class="text">Шесть</span></li>
<li style="top:100px;left:100px"><span class="text">Семь</span></li>
</ul>

<div id="lava" class="ui-corner-all"></div>

<p>Код такой<p>
<pre><code class="html">
&lt;ul id="lavalamp" class="ui-corner-all"&gt;
&lt;li style="top:60px;left:20px" class="active"&gt;&lt;span class="text"&gt;Один&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="top:40px;left:150px"&gt;&lt;span class="text"&gt;Два&lt;/span&gt;&lt;/li&gt;
&lt;li style="top:10px;left:50px"&gt;&lt;span class="text"&gt;Три&lt;/span&gt;&lt;/li&gt;
&lt;li style="top:60px;left:100px"&gt;&lt;span class="text"&gt;Четыре&lt;/span&gt;&lt;/li&gt;
&lt;li style="top:120px;left:10px"&gt;&lt;span class="text"&gt;Пять&lt;/span&gt;&lt;/li&gt;
&lt;li style="top:10px;left:150px"&gt;&lt;span class="text"&gt;Шесть&lt;/span&gt;&lt;/li&gt;
&lt;li style="top:100px;left:100px"&gt;&lt;span class="text"&gt;Семь&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div id="lava" class="ui-corner-all"&gt;&lt;/div&gt;
</code></pre>

<pre><code class="css">
#lavalamp {
	display: block;
	height: 150px;
	border: 5px solid #FF7F04;
	background: #ff7f04; /* old browsers */
	background: -moz-linear-gradient(top, #ff7f04 0%, #ffb76b 99%); /* firefox */
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff7f04), color-stop(99%,#ffb76b)); /* webkit */
	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff7f04', endColorstr='#ffb76b',GradientType=0 ); /* ie */
}

    #lavalamp li {
		color: #808080;
		cursor: pointer;
		display: block;
		float: left;
		height: 25px;
		position: relative;
		z-index: auto;
		padding: 0;
    }

        #lavalamp li span {
			display: block;
			font-size: 14px;
			font-weight: bold;
			line-height: 25px;
			position: relative;
			text-decoration: none;
			z-index: 200;
			padding: 0 5px;
        }

#lava {
	background-color: #e57807;
	position:absolute;
	left:0;
	top:0;
	height:0;
	width:0;
	z-index:100;
}
</code></pre>
<p>Градиент сделан при помощи тулзы <a href="http://www.colorzilla.com/gradient-editor/" rel="nofollow external">Ultimate CSS Gradient Generator</a><p>

<pre><code class="javascript">
jQuery(document).ready(function($){
	$("#lavalamp")
		.delegate("li","mouseenter",null,function(){
			var self = $(this);
			$("#lava").stop().animate({
				top : self.offset().top,
				left : self.offset().left,
				width : self.outerWidth(true),
				height : self.outerHeight(true)
			})
		})
		.delegate("li","click",null,function(){
			alert($(this).text());
		})
		.bind("mouseleave",null,function(){
			$(".active",this).eq(0).trigger("mouseover");
		})
		.trigger("mouseout");
});
</code></pre>

<p><p>
<p><p>
<p><p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/11/27/lavalamp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Легкий список</title>
		<link>http://mabp.kiev.ua/2010/11/23/lightweight-list/</link>
		<comments>http://mabp.kiev.ua/2010/11/23/lightweight-list/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 19:26:17 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryUI]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1302</guid>
		<description><![CDATA[Давно я не писал ничего полезного, от части потому что не было реальных заданий от части потому, что последние время их было слишком много. А сегодня я расскажу как сделать красивый и "легкий" список. Для списка я использовал jQueryUI, а вы можете написать все стили руками, если есть желание. Итак сначала пример, а потом разбор [...]]]></description>
			<content:encoded><![CDATA[<p>Давно я не писал ничего полезного, от части потому что не было реальных заданий от части потому, что последние время их было слишком много. А сегодня я расскажу как сделать красивый и "легкий" список.</p>
<span id="more-1302"></span>

<link rel="stylesheet" type="text/css" media="screen" href="/content/css/lightweight-list.css"/>
<script type="text/javascript" src="/content/js/lightweight-list.js"></script>


<p>Для списка я использовал jQueryUI, а вы можете написать все стили руками, если есть желание. Итак сначала пример, а потом разбор кода.</p>

<div class="container ui-widget ui-widget-content ui-corner-all">
	<ul id="list">
		<li value="1">Один</li>
		<li value="2">Два</li>
		<li value="3">Три</li>
		<li value="4">Четыре</li>
		<li value="5">Пять</li>
	</ul>
	<div class="controls">
		<span class="ui-state-default ui-corner-all" title=""><span class="ui-icon ui-icon-pencil"></span></span><span class="ui-state-default ui-corner-all" title=""><span class="ui-icon ui-icon-close"></span></span>
	</div>
</div>




<p>Итак в разметке ничего страшного нет, это простой список и две кнопочки: "редактировать", "удалить".</p>

<pre><code class="html">
&lt;div class="container ui-widget ui-widget-content ui-corner-all"&gt;
	&lt;ul id="list"&gt;
		&lt;li value="1"&gt;Один&lt;/li&gt;
		&lt;li value="2"&gt;Два&lt;/li&gt;
		&lt;li value="3"&gt;Три&lt;/li&gt;
		&lt;li value="4"&gt;Четыре&lt;/li&gt;
		&lt;li value="5"&gt;Пять&lt;/li&gt;
	&lt;/ul&gt;
	&lt;div class="controls"&gt;
		&lt;span class="ui-state-default ui-corner-all" title=""&gt;&lt;span class="ui-icon ui-icon-pencil"&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class="ui-state-default ui-corner-all" title=""&gt;&lt;span class="ui-icon ui-icon-close"&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;/div&gt;
&lt;/div&gt;
</code></pre>

<pre><code class="css">
.container {
	width: 300px;
	position:relative;
}
#list {
	padding: 10px;
}
#list li {
	line-height: 18px;
	list-style: none outside none;
	padding: 1px;
	border: 1px solid transparent;
}
.controls {
	cursor:pointer;
	display:none;
	position:absolute;
	right: 10px;
	font-size: 1px;
	padding: 2px;
}
.controls span {
	display: block;
	float : left;
	width : 16px;
	height  : 16px;
	line-height: 0 !important; /*перекрываю стили вордпресса */
}
</code></pre>

<p>CSS тоже достаточно просто, кроме того что я даю контейнеру position:relative, это позволяет задать контролам right: 10px и не высчитывать положение по левой стороне, более того это еще удобно тем что в таком случаи контролов может быть разное количество для разных элементов списка.</p>

<p>А теперь самое интересное.</p>
<pre><code class="javascript">
$(document).ready(function(){

	function doSomething(){
		alert("I'm dummy function");
	}
	
	$("#list")
		.delegate("li","mouseenter",null,function(){
			var self = $(this);
			id = self.attr("value")
			self.addClass("ui-state-hover").siblings(".ui-state-hover").removeClass("ui-state-hover");
			self.parent().siblings(".controls").show().css({top:self.position().top});
		})
		.delegate("li","click",null,function(){
			var self = $(this);
			doSomething(self.attr("value"));
		})
		.parent()
		.bind("mouseleave",null,function(){
			var self = $(this);
			self.find("li.ui-state-hover").removeClass("ui-state-hover");
			self.find(".controls").hide();
		})
		.find(".ui-state-default")
		.bind("mouseenter",null,function(){
			$(this).addClass("ui-state-hover");
		})
		.bind("mouseleave",null,function(){
			$(this).removeClass("ui-state-hover");
		})
		.end()
		.find(".ui-icon-close")
		.bind("click",null,function(){
			doSomething(id);
		})
		.end()
		.find(".ui-icon-pencil")
		.bind("click",null,function(){
			doSomething(id);
		});
})
</code></pre>

<p>Сначала делегируем списку событие появления курсора над конкретным элементом, это дает возможность подсветить его (элемент), и пододвинуть к нему контролы. mouseover тут использовать нельзя потому что при наведении на котнролы они получат mouseover и пропадет подсветка на  элементе и получиться мигание. По этой же причине mouseleave повешен не на список а на его родителя.</p>

<p>Дальше все предельно просто - навешены события на раскрашивание и подсвечивание контролов.</p>

<p>ЗЫ если остался вопрос почему список легкий - потому что события навешиваються не на каждый элмент а дедегируються родителю. Вторая причина это то, что используеться только две кнопки для создания контролов, вместо того чтобы при наведении на каждый элемент динамически создавать новые и добавлять их в дом дерево, или делать видимыми уже существующие.</p>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/11/23/lightweight-list/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

