<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Ы</title>
	<atom:link href="http://rumkin.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://rumkin.wordpress.com</link>
	<description>Дизайн, избранное</description>
	<lastBuildDate>Sun, 31 Aug 2008 20:44:21 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='rumkin.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Ы</title>
		<link>http://rumkin.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://rumkin.wordpress.com/osd.xml" title="Ы" />
	<atom:link rel='hub' href='http://rumkin.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Замена стандартному элементу input file</title>
		<link>http://rumkin.wordpress.com/2007/08/30/replace-standart-input-control/</link>
		<comments>http://rumkin.wordpress.com/2007/08/30/replace-standart-input-control/#comments</comments>
		<pubDate>Thu, 30 Aug 2007 01:09:43 +0000</pubDate>
		<dc:creator>rumkin</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[input]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://rumkin.wordpress.com/2007/08/30/%d0%97%d0%b0%d0%bc%d0%b5%d0%bd%d0%b0-%d1%81%d1%82%d0%b0%d0%bd%d0%b4%d0%b0%d1%80%d1%82%d0%bd%d0%be%d0%bc%d1%83-%d1%8d%d0%bb%d0%b5%d0%bc%d0%b5%d0%bd%d1%82%d1%83-input-file/</guid>
		<description><![CDATA[Недавно, занимаясь кастомизацией (да простят меня русоведы) стандартных элементов формы, а в частности элемента file, я наткнулся на большую неприятность: он оказался не профпригоден для настройки. Суть вот в чём: от элемента file нам особенно нужно его диалоговое окно &#171;Upload files&#187;, добыть который программными средствами в браузерах Mozilla и Opera невозможно, т.е. команда document.getElementById(&#8216;SaveForm&#8217;).click(); ничего [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rumkin.wordpress.com&amp;blog=1565748&amp;post=3&amp;subd=rumkin&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Недавно, занимаясь кастомизацией (да простят меня русоведы) стандартных элементов формы, а в частности элемента file, я наткнулся на большую неприятность: он оказался не профпригоден для настройки. Суть вот в чём: от элемента file нам особенно нужно его диалоговое окно &laquo;Upload files&raquo;, добыть который программными средствами в браузерах Mozilla и Opera невозможно, т.е. команда <span style="color:#800080;">document.</span>getElementById<strong>(</strong>&#8216;SaveForm&#8217;<strong>)</strong>.click<strong>()</strong>; ничего не вернёт. Разработчики уверяют что это небезопасно, что спорно. А вот IE меня порадовал, он беспрепятственно отправляет нажатие мыши в элемент file, скорее всего по недосмотру разработчиков, оставивших «ужаснейшую дыру» в Вашей безопасности.</p>
<p>Как я только не изворачивался ничего не получалось. Прогуглив три часа, наткнулся на первое свиду идеальное решение: поместить file в div, сделать div прозрачным (opacity: 0%), обращаю ваше внимание именно на то что сделать его нужно прозрачным, но не невидимым (visibility: hidden), условно говоря opacity: 0% прячет элемент от глаз, а visibility:hidden ещё и от мыши. Но если поиграть с размерами шрифтов, метод начинает терять свою привлекательность, появляется возможность промахнуться мимо невидимой кнопки.</p>
<p>Спустя час, я наткнулся на ещё один пример yamzbrowser (позволяет осуществлять загрузку файлов на сервер из swf-объекта вставленного в html-страницу). Он повторяет первый метод, но! с одной лишь разницей: он подставляет div под курсор мыши при перемещении. Кстати, обнаружить это  мне удалось именно благодаря Опере (обычно я пользуюсь Лисой, и это большая случайность что я открыл пример именно Оперой), так как автор забыл установить прозрачность ещё и для неё.</p>
<p>Изучив оба метода, я соединил их в одно и разработал решение для более широкого применения в Сети. И так, присаживайтесь поудобнее мы начинаем.</p>
<h3>Допущения</h3>
<ol>
<li>Размер элемента подменяющего file могут значительно отличаться от размеров самого file&#8217;а</li>
<li>Элемент file явлеятся частью формы</li>
<li>Только параноик отключает JavaScript в браузере</li>
<li>Посетитель относится к тем скромным 99% пользователей использующих Firefox, Opera или IE</li>
<li>Решение должно работать по одинаковому алгоритму во всех браузерах, т.е. вариант использования разных средств для IE — <span style="color:#800080;">document</span>.getElementById<strong>(</strong>&#8216;SaveForm&#8217;<strong>)</strong>.click<strong>();</strong>, а для FF и Opera — подстановка, неприемлем</li>
<li>Решение может дублироваться на страни</li>
</ol>
<h3>Алгоритм</h3>
<p>При наведении мыши на подменяющую кнопку слой с элементом подставляется под курсор, так что бы курсор был в середине слоя, т.о. мы будем точно знать что пользователь не промахнётся мимо кнопки и visibility меняется на visible: слой с элементом остаётся невидимым, но доступным для мыши. При перемещении курсора двигаем слой в пределах подменяющей кнопки, по достижению края кнопки visibility получает значение hidden.</p>
<h3>Рецепт</h3>
<h4>HTML</h4>
<p><code>&lt;form&gt;<br />
&lt;div id="divFile1" class="file" onmousemove="divFileMove(this.id, 'buttonFile1',event);"&gt;<br />
&lt;input type="file" name="UploadFile" id="file1" size="1" onchange="result(this.id, 'divResult');" /&gt;<br />
&lt;/div&gt;<br />
&lt;div id="divResult"&gt; &lt;/div&gt;<br />
&lt;image src="./images/fileUploadButton.jpg" id="buttonFile1" onmouseover="divFileShow('divFile1', event);"/&gt;<br />
&lt;/form&gt;</code></p>
<h4>CSS</h4>
<p><code><br />
<strong><span style="color:#000000;"> div.file{</span></strong><br />
position:               <span style="color:#3366ff;"> absolute</span><span style="color:#000000;">;</span><br />
top:                        <span style="color:#3366ff;">1000px</span>;<br />
left:                        <span style="color:#3366ff;">1000px</span>;<br />
-moz-opacity:       <span style="color:#3366ff;">0</span>;<br />
filter:                      <span style="color:#3366ff;">alpha(opacity=0)</span>;<br />
opacity:                  <span style="color:#3366ff;">0%</span>;<br />
visibility: <span style="color:#3366ff;">hidden</span>;<br />
<strong>}</strong><br />
</code><br />
div.file — используется именно класс .file а не id, ввиду допущения номер 6.<br />
top, left: 1000px — прячет слой до того как до него доберётся javascript.<br />
-moz-opacity, filter: alpha,  opacity — задаёт прозрачность для FF, IE и Opera соответственно.<br />
visibility: hidden — скрывает от мыши.</p>
<h4>JavaScript</h4>
<p>Функция divFileShow(divId,e), где divId — id слоя с элементом file, e — event. Функции mouseX и mouseY высчитывают положение мыши относительно левого верхнего угла для всех браузеров.</p>
<p><span style="color:#000080;"><strong>function </strong></span>divFileShow<span style="color:#333399;"><strong>(</strong></span>divId,e<span style="color:#333399;"><strong>){</strong></span> <span style="color:#000080;"><strong>var</strong></span> div <span style="color:#0000ff;">=</span> <span style="color:#800080;">document</span>.getElementById<span style="color:#333399;"><strong>(</strong></span>divId<span style="color:#333399;"><strong>)</strong></span>;    div.style.left <span style="color:#0000ff;">=</span> <span style="color:#333399;"><strong>(</strong></span>mouseX<span style="color:#333399;"><strong>(</strong></span>e<span style="color:#333399;"><strong>)</strong></span> <span style="color:#0000ff;">-</span> <span style="color:#008080;">Math</span>.<span style="color:#008080;">round</span><span style="color:#333399;"><strong>(</strong></span>div.offsetWidth<span style="color:#0000ff;">/</span><span style="color:#ff0000;">2</span><span style="color:#333399;"><strong>))</strong></span><span style="color:#0000ff;">+</span> <span style="color:#3366ff;">&laquo;px&raquo;</span>;div.style.top <span style="color:#0000ff;">=</span> <span style="color:#333399;"><strong>(</strong></span>mouseY<span style="color:#333399;"><strong>(</strong></span>e<span style="color:#333399;"><strong>)</strong></span> <span style="color:#0000ff;">-</span> <span style="color:#008080;">Math</span>.<span style="color:#008080;">round</span><span style="color:#333399;"><strong>(</strong></span>div.offsetHeight<span style="color:#0000ff;">/</span><span style="color:#ff0000;">2</span><span style="color:#333399;"><strong>))</strong></span> <span style="color:#0000ff;">+</span> <span style="color:#3366ff;">&laquo;px&raquo;</span>;</p>
<p>div.style.visibility <span style="color:#0000ff;">=</span> <span style="color:#3366ff;">&laquo;visible&raquo;</span>;</p>
<p><strong>}</strong><br />
Функция divFileMove(divId, butId, e), где divId — id слоя, butId — id подменяющей кнопки (необходим для получения габаритов кнопки), e — event</p>
<p><code><br />
<span style="color:#000080;"><strong>function </strong></span>divFileMove<strong>(</strong>divId, butId, e<strong>){</strong> var div <span style="color:#000080;">=</span> <span style="color:#800080;">document.</span>getElementById<strong>(</strong>divId<strong>)</strong>;</code></p>
<p>var button <span style="color:#000080;">=</span> <span style="color:#800080;">document</span>.getElementById<strong>(</strong>butId<strong>)</strong>;</p>
<p>var move <span style="color:#000080;">=</span> <strong>true</strong>;</p>
<p>var divX <span style="color:#000080;">=</span> <span style="color:#008080;">parseInt</span><span style="color:#000000;"><strong>(</strong>div</span>.style.left<strong>)</strong> <span style="color:#000080;">+</span> <span style="color:#008080;">Math</span>.<span style="color:#008080;">round</span><strong>(</strong>div.offsetWidth/2<strong>)</strong>;</p>
<p>var divY <span style="color:#000080;">=</span> <span style="color:#008080;">parseInt</span><strong>(</strong>div.style.top<strong>)</strong> <span style="color:#000080;">+</span> <span style="color:#008080;">Math</span>.<span style="color:#008080;">round</span><strong>(</strong>div.offsetHeight/2<strong>)</strong>;    <strong>if (</strong>divX <span style="color:#000080;">&lt;</span> button.offsetLeft <span style="color:#000080;">||</span> divX <span style="color:#000080;">&gt;</span> <strong>(</strong>button.offsetLeft<span style="color:#000080;">+</span>button.offsetWidth<strong>))</strong> <strong>{</strong></p>
<p>move <span style="color:#000080;">=</span> <strong>false</strong>;</p>
<p><strong> }</strong></p>
<p><strong>if (</strong>divY <span style="color:#000080;">&lt;</span> button.offsetTop <span style="color:#000080;">||</span> divY <span style="color:#000080;">&gt;</span> <strong>(</strong>button.offsetTop <span style="color:#000080;">+</span> button.offsetHeight<strong>)){</strong></p>
<p>move <span style="color:#000080;">=</span> <strong>false</strong>;</p>
<p><strong> }</strong></p>
<p><strong>if</strong> <strong>(</strong>move<strong>){</strong></p>
<p>div.style.left <span style="color:#000080;">=</span> <strong>(</strong>mouseX<strong>(</strong>e<strong>)</strong> <span style="color:#000080;">-</span> div.offsetWidth<span style="color:#000080;">/</span><span style="color:#ff0000;">2</span><strong>)</strong> + <span style="color:#3366ff;">&laquo;px&raquo;</span>;</p>
<p>div.style.top <span style="color:#000080;">=</span> <strong>(</strong>mouseY<strong>(</strong>e<strong>)</strong> <span style="color:#000080;">-</span> div.offsetHeight<span style="color:#000080;">/</span><span style="color:#ff0000;">2</span><strong>)</strong> + <span style="color:#3366ff;">&laquo;px&raquo;</span>;</p>
<p><strong> }</strong> <strong>else {</strong></p>
<p>div.style.visibility <span style="color:#000080;">=</span> <span style="color:#3366ff;">&laquo;hidden&raquo;</span>;</p>
<p><strong> }</strong></p>
<p><strong>}</strong></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/rumkin.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/rumkin.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/rumkin.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/rumkin.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/rumkin.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/rumkin.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/rumkin.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/rumkin.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/rumkin.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/rumkin.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/rumkin.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/rumkin.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/rumkin.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/rumkin.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/rumkin.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/rumkin.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=rumkin.wordpress.com&amp;blog=1565748&amp;post=3&amp;subd=rumkin&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://rumkin.wordpress.com/2007/08/30/replace-standart-input-control/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/65ad5f712c74f9e9aa28135d7e2eb586?s=96&#38;d=identicon" medium="image">
			<media:title type="html">rumkin</media:title>
		</media:content>
	</item>
	</channel>
</rss>
