<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JS: Editable ComboBox]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=14600</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=14600&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JS: Editable ComboBox».]]></description>
		<lastBuildDate>Sat, 23 Feb 2019 14:42:28 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[JS: Editable ComboBox]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=132422#p132422</link>
			<description><![CDATA[<p>С праздником, мужики!</p><p>Обычно в поле с комбобоксом можно вводить данные. Всеми это воспринимается как само собой разумеющееся.<br />Реализация комбобокса для браузеров (с помощью &lt;SELECT&gt; и &lt;OPTION&gt;) не подразумевает ввод текста вручную.<br />Ну а если оно надо? - Тогда каждый идет своим путем. Вариантов в инете - предостаточно. Вот и я предлагаю свой.</p><p>Маленький код на чистом JS без всяких фреймворков, графических элементов и новомодных изысков HTM5.<br />По сути к обычному объекту SELECT добавлены несколько дополнительных свойств.</p><p>Создается комбобокс командой<br /></p><div class="codebox"><pre><code>new ComboBox(idCell, &#039;idCB&#039;, &#039;150px&#039;); </code></pre></div><p><span style="color: blue">idCell</span> - id элемента куда он будет вставляться;<br /><span style="color: blue">&#039;idCB&#039;</span> - строка, содержащая id будущего комбобокса;<br /><span style="color: blue">&#039;150px&#039;</span> - строка, содержащая ширину будущего комбобокса (если данный параметр отсутствует, то комбобокс займет 100% ширины родителя);</p><p>Помимо привычных свойств и методов, присущих любому элементу SELECT, в наш комбобокс добавлены еще четыре:<br /><span style="color: blue">setText(&#039;mytext&#039;)</span> - установка текста в поле ввода (того, что можно ввести вручную);<br /><span style="color: blue">getText()</span> - получение текста из поля ввода;<br /><span style="color: blue">addOptions(array)</span> - добавление новых пунктов в комбобокс (Добавляются только если такие пункты отсутствуют);<br /><span style="color: blue">getOptions()</span> - возвращает массив, содержащий список пунктов комбобокса.</p><p>Несколько замечаний:<br />1. Элемент в который подразумевается вставлять данный комбобокс должен иметь ширину, большую чем ширина комбобокса.<br />2. Данный комобокс создавался исключительно для IE (точнее - для HTA) и во всех IE6..IE11 смотрится вполне прилично. Попробовал в Chrom и Firefox - код четко работает и там, вот только дизайн - значительно хуже, но полагаю, желающие смогут это поправить.</p><p>Теперь, собственно, сам код с наглядным примером его использования:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
&lt;meta http-equiv=MSThemeCompatible content=yes&gt;
&lt;style type=&quot;text/css&quot;&gt;
	* {font:10pt verdana;}
	table {border-collapse:collapse;}
	table, td {border:1px solid green;}
	td {padding:4px 6px;}
&lt;/style&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	// ComboBox с возможностью ручного ввода
	function oComboBox (oContainer, id, width) {
		var oSelect = document.createElement(&#039;SELECT&#039;);
		oSelect.id = id;
		oSelect.style.width = width || &#039;100%&#039;;
		oSelect.style.position = &#039;absolute&#039;;
		var oInput = document.createElement(&#039;INPUT&#039;);
		oInput.style.position = &#039;relative&#039;;
		oContainer.appendChild(oSelect);
		oContainer.appendChild(oInput);
		oSelect.style.top = oInput.offsetTop + &#039;px&#039;;
		oSelect.style.clip = &#039;rect(auto auto auto &#039; + (oSelect.offsetWidth - 20) + &#039;px)&#039;;
		oInput.style.width = oSelect.offsetWidth - 19 + &#039;px&#039;;
		oSelect.onchange = function(){oInput.value=this.options[this.selectedIndex].text; oInput.select();};

		// Установка текста в поле ввода
		oSelect.setText = function(text) {
			oSelect.selectedIndex = -1;
			for (var j=0; j&lt;oSelect.options.length; j++) {
				if (oSelect.options[j].text.toUpperCase() == text.toUpperCase()) oSelect.selectedIndex = j;
			}
			oInput.value = text;
		};

		// Получение текста в поле ввода
		oSelect.getText = function() {return oInput.value;};

		// Добавление новых пунктов в ComboBox (только если такие отсутствуют)
		oSelect.addOptions = function (aOptions) {
			function isOptionExist(text) {
				for (var j=0; j&lt;oSelect.options.length; j++) {
					if (oSelect.options[j].text.toUpperCase() == text.toUpperCase()) return true;
				}
			}
			for (var i=0; i&lt;aOptions.length; i++) {
				if (!isOptionExist(aOptions[i])) {
					var oOption = document.createElement(&quot;option&quot;);
					oOption.text = aOptions[i];
					oSelect.options.add(oOption);
					oSelect.selectedIndex = oSelect.options.length-1;
					oInput.value = oSelect.options[oSelect.options.length-1].text;
				}
			}
		};

		// Возвращает массив, содержащий список пунктов ComboBox
		oSelect.getOptions = function () {
			var aOptions = [];
			for (var j=0; j&lt;oSelect.options.length; j++) {
				aOptions.push(oSelect.options[j].text);
			}
			return aOptions;
		};

	}

	function Sample() {
		var o = new oComboBox(idCell, &#039;idCB&#039;, &#039;150px&#039;);
		idCB.addOptions([&#039;RED&#039;, &#039;GREEN&#039;, &#039;BLUE&#039;]);
		idCB.addOptions([&#039;yellow&#039;,  &#039;red&#039;, &#039;orange&#039;]);
		idCB.setText(&#039;Blue&#039;);
	}

&lt;/script&gt;
&lt;title&gt;Editable ComboBox&lt;/title&gt;
&lt;/head&gt;
&lt;body onload=&quot;Sample();&quot;&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td id=&quot;idCell&quot; style=&quot;width:200px;&quot;&gt;&lt;/td&gt;
		&lt;td&gt;new methods&lt;/td&gt;
		&lt;td&gt;
			&lt;input type=&quot;button&quot; value=&quot;setText(text)&quot; onclick=&quot;idCB.setText(&#039;crimson&#039;)&quot;&gt;
			&lt;input type=&quot;button&quot; value=&quot;getText()&quot; onclick=&quot;alert(idCB.getText())&quot;&gt;
			&lt;input type=&quot;button&quot; value=&quot;addOptions(array)&quot; onclick=&quot;idCB.addOptions([&#039;Violet&#039;,&#039;Silver&#039;])&quot;&gt;
			&lt;input type=&quot;button&quot; value=&quot;getOptions()&quot; onclick=&quot;alert(idCB.getOptions())&quot;&gt;
		&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;&amp;nbsp;&lt;/td&gt;
		&lt;td&gt;built-in methods&lt;/td&gt;
		&lt;td&gt;
			&lt;input type=&quot;button&quot; value=&quot;selectedIndex&quot; onclick=&quot;alert(idCB.selectedIndex)&quot;&gt;
			&lt;input type=&quot;button&quot; value=&quot;outerHTML&quot; onclick=&quot;alert(idCB.outerHTML)&quot;&gt;
			&lt;input type=&quot;button&quot; value=&quot;change option text&quot; onclick=&quot;idCB.options[idCB.selectedIndex].text=&#039;New Text&#039;;&quot;&gt;
		&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div></div></div><p>Буду рад услышать любые конструктивные замечания и предложения (для того и выкладываю).</p>]]></description>
			<author><![CDATA[null@example.com (mozers)]]></author>
			<pubDate>Sat, 23 Feb 2019 14:42:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=132422#p132422</guid>
		</item>
	</channel>
</rss>
