Виж пълна версия : Въпрос за js и още нещо :D
BornToDrink
22.10.08 г., 00:54
Значи какъв е проблема.
Ползвам този туториал за една формичка с AJAX:
http://www.w3schools.com/PHP/php_ajax_database.asp
Всичко е ОК, но в моя случай, txtHint не е див, а селект, или иначе казано:
<select name="cat" onchange="showUser(this.value)">
<option....
<option....
</select>
<select name="select" id="txtHint">
</select>
Значи ако се загледате в примера, идеята е, в случай на селект на някое валю от първия select, се вика showUser(); В която функция се инклудва php файл и плющи инфото във елемент със id="txtHint".
Във w3 примера е даден със <div id="txtHint"...
Но мен ми трябва със селект.
Нагласих го и всичко бачкаше ток и жица, ДОКАТО не го отворих със любимото IE6/7. :D
Там просто не работи.
"Фикснах" проблема като изместих целия селект да се показва от php файла, а не само опшъните и сложих един див за "мишена". Така работи, но селекта първоначално го няма и мен не ме кефи тоя вариант, въпреки, че за някои случаи е гоцки.
И понеже ме няма откъм JS, има ли алтернативен вариант.
Благодаря предварително и ако има въпроси поради НЕдобро обяснение.. питайте. :D
Направи така:
1) Преместваш си целия "select" в PHP-то.
2) В <div> с id - txtHint сложи един "фалшив" select, който ще се замени с "новия" след като си избереш опцията от AJAX-а.
3) Кефи. :)
BornToDrink
22.10.08 г., 01:40
Еее, супер си баце, не ми беше минавал тоя вариант... :drinks:
И тъй в бързините да попитам за някой линк за валидация на форма с аякс...
От намерените от мен в гугъл, досега не съм попадал на свястно обяснение + кода, както горния линк. Предполагам принципа ще е подобен, само трябва да се смени от onchange на друго и да минава през $_POST... е и да пуска повече данни. :D
PS - другата тема си я репортнах, че нещо се омаза докато поствах. :)
Еее, супер си баце, не ми беше минавал тоя вариант... :drinks:
И тъй в бързините да попитам за някой линк за валидация на форма с аякс...
От намерените от мен в гугъл, досега не съм попадал на свястно обяснение + кода, както горния линк. Предполагам принципа ще е подобен, само трябва да се смени от onchange на друго и да минава през $_POST... е и да пуска повече данни. :D
Аз за валидация на полета (изписване на текст някъде или показване на иконка - bad / good) ползвам $_REQUEST метода. А самият код можеш така или иначе след това при "post" да си го валидираш отделно с $_POST. Можеш да видиш моят вариант на Survive (http://survive.atomcorestudios.com/register.html).
Bombera
22.10.08 г., 02:53
<select name="cat" onchange="showUser(this.value)">
<option....
<option....
</select>
<select name="select" id="txtHint">
</select>
Грешка има тук - name и id трябва да са едни и същи. Не знам дали тя предизвиква неработенето в ИЕ, обаче. :)
Селектите по принцип не са общи контейнерни елементи също така, и поведението на ИЕ може да е правилното, кой знае...
BornToDrink
22.10.08 г., 10:38
z0ne, мерси за линка, яко е направен сайта!
Bombera, пробвах с еднакви ID & name (май..!?, пробвах толко неща, че не съм сигурен вече точно кое :D ) и не стана.
Иначе може да си прав за ИЕ. :)
Абе хора, няма такова нещо, че трябва да са еднакви id и name!
И няма проблем с JS да се сетва избрания Option.
Не е добре целия селект да се разхожда през сървъра постоянно...
Защо не дадеш кода, с който сменяш опциите?
За валидирането също няма проблем (ако се налага) да се прави от сървъра с AJAX.
Вържи го на събмит-бутона или на onSubmit-евента на Формата.
Скрипта да събира стойностите на полетата, които трябва да се валидират (и това не може да стане при клиента).
Пращаш ги с AJAX, връща ти се масив с лошите полета. (Пробвай да връщаш с json.)
Ако масивът е празен - събмит, ако не е - слагаш alert или друг вид надпис кои стойности не са хубави.
BornToDrink
23.10.08 г., 15:06
Кода на JS-а съм го дал в линка, единствено съм сменил името на функцията да е само show();
И в php файла ми идват option-ите само.
После селекта е както и в първия пост:
<select name="cat" onchange="show(this.value)">
<option>Избери категория</option>
<option value="4">Примерна катeгория</option>
</select>
<select name="subcat" id="txtHint">
</select>
Резултат: с ФФ работи, с ИЕ - не.
Като преместя целия селект да го плюе в div - работи с всичко.
Bombera
23.10.08 г., 17:03
document.getElementById("txtHint").innerHTML=xmlHttp.responseText
Червеното прапърти е само за контейнерни елементи(SPAN, DIV, TD - за последното може и да се лъжа), селектите нямат такова, в IE със сигурност. Аз не разбрах защо този втория селект в който искаш да се появява въпросният текст е без опции(option)? Без такива, той губи смисъла си като такъв. Селект-ът по принцип е бездименционен елемент => не е контейнер. С прости думи, ако се показва само текст вътре, няма смисъл да се ползва само той. Ако искаш да добавиш опция в него, кода на функцията трябва да изглежда съвсем другояче. Мога да ти я напиша. Защо ти е нужен именно селект да попитам пак? :)
Проблема с идентификаторите(name и id) не е болка за умиране. Не е ясно как таг-ва елементите ИЕ - може би първото намерено нейм или аид се присвоява на елемента, следващите се игнорират(мързи ме да проверя, ако трябва да съм честен :)). Селект елементите могат да се достъпват и по друг начин, еднозначно с нейм прапъртито от document.forms[], затова за да няма различия, може би ИЕ приема само единия атрибут за валиден. Поддръжката на двата атрибута не ми се е налагало да преследвам и не се сещам ситуация в която да е нужно. Name по принцип е deprecated, т.е остарял атрибут, мисля. Направи ги еднакви, просто няма смисъл да са различни.
Предполагам, че се опитваш съответстващи данни на имена от един списък да ги вкараш в друг - т.е само тези, които се избират, да присъстват във втория. Правилният начин е друг и ако кажеш какъв искаш да е крайният резултат, ще ти го напиша.
P.S. И селектите имат innerHTML, не го реферираш правилно сигурно. Уеднакви нейм и айд и в getElementdById() за параметър сложи името, което си избрал. За да се види като опция обаче, <option>teskta ot zaqwkata
tuka</option>.
От извора:
http://msdn.microsoft.com/en-us/library/ms535893(VS.85).aspx
Може да провериш все пак дали може да съдържа друг ХМТЛ вътре с метода bool canHaveHTML(void). Там го има в таблицата и като го избереш, в новата страница има пример.
P.S.S . Опа, сорка! Нов пост.
1. Задачата за свързани селекти не е нужно да се решава с AJAX.
Обикновено се пестят ресурси, ако се решава изцяло от клиентската страна (лично мнение). Но за упражяване на нещата си е подходяща.
2. Независимо дали се ползва сървъра или не, в даден момент ти разполагаш с масив (или обект), в който се намира списъка с опциите - име и стойност за всяка опция. И от тоя момент нататък имаш чистата JS-задача да ги сложиш в селекта. Където ти е проблема в случая.
3. Атрибутът "name" е този, с който елементът ще се събмитне към сървъра. Нито е забранен, нито излишен. Даже обратно - вички неща, които трябва да се пратят към сървъра, са длъжни да го имат. Той може да се ползва от браузера и за да се достъпва елемента. Атрибутът "id" се ползва главно за скриптовете (понякога и за стиловете).
4. Казваш, че си дал скрипта, но в оня пример сървъра връща стринг, а в твоята задача не знам какво връща. Би трябвало да е масив или обект. Не ми се гадае, затова давам примерен код как да си попълниш опциите, а ти ще си го донагодиш:
След като посрещнеш отговора от сървъра и го парснеш, да кажем, че от него си създал обект optList с индексите и имената на пристигналите опции. След което извикай тая функцийка:
function loadOptions(optList) {
var sel = document.getElementById('txtHint'); // селекта, който ще попълваме
sel.options.length = 0; // изтрива старите опции
var newOpt; // нов option
for (var i in optList) { // обхожда масива с новите опции
newOpt = document.createElement('option');
newOpt.value = i;
newOpt.innerHTML = optList[i];
sel.appendChild(newOpt); // добавя опцията към селекта
}
}
5. Да, селектите също имат innerHTML, но ИЕ се шашка и изяжда първия таг. Затова не става да връщаш от сървъра просто стринг с '<option value="1">edno</option><option value="2">dve</option>'.
Ако искаш пробвай долното и ще се увериш:
<select id="txtHint">
<option/>
</select>
<script>
var sel = document.getElementById('txtHint');
sel.innerHTML = '<option value="1">edno</option>';
alert(sel.innerHTML);
</script>
Алърта ще ти покаже бъга на ИЕ.
Но дори да работеше това, тоя начин е доста дърварски (пак лично мнение)...
BornToDrink
24.10.08 г., 01:19
Мерси за отговорите.
Bombera:
Няма option-и, защото първо трябва да се избере опшън от първия селект.
Вече като избере, JS-а му взема value-то, праща го на инклуднатия в .js-a .php файл по GET, там вече го обработвам така:
Вземам value-то от първия селект, пускам sql заявка и връщам:
<option value=$sql['id']>$sql['name']</option> .. образно казано.
И вече селекта ми има опшъни, като юзера следва да си избере и от там едно и вече след попълнени всички задължителни се пише в базата.
==============
Flower:
1. Да, пропуснах кода от php файла, тоест по-важното е, че пропуснах да кажа, че се връзва с sql, понеже примерния php файл го има в линка от w3.
...
Както казах, JS не отбирам и гледам да ползвам готови скриптове, като тоя ми се стори добър, само дето имах проблем под ИЕ, но той се реши от примера на z0ne по-горе.
Сори ако не съм се изразил добре някъде, но уточних ако има неяснотии... :)
===
Тъй де, дори второто нещо, за което питах ми трябва да е на тоя принцип, щото там пак има заявки към базата за валидация, преди да се изпълни субмит формата и не искам всеки път да рефрешвам страницата... :)
А поправете ме ако греша, но с чист JS това не може да стане? :)
Bombera
24.10.08 г., 02:24
Става, разбира се. На същия принцип както работи и този пример. Пращаш една ГЕТ заявка с данните от формата, скрипта обработва и ти връща стринг в страницата, който съдържа информацията валидни ли са пратените данни или не. Въпроса как ще е представена при връщане от скрипта и как ще я интерпретираш и обработиш с JS, когато се върне в браузъра, си е твоя работа.
Не съм много обстоятелствен, за да не те подведа нещо, малко съм далече от Леб-овете тая година :)
P.S. Не го наричай AJAX това. Това са си "асинхронни ХТТП заявки", които използва AJAX. На мен лично не ми харесва като нарицателно, щото не е нещо, което създателите на AJAX са измислили. Аз примерно правех това през Java аплети, като стъб, още през 2000-та. Фечвах динамичен контент от сървъра през аплета и той го предаваше на javascript-ове, които оформяха контента в DIV-ове. Сега същото се прави от вградени браузърни обекти.
IE4/5 рулираха тогава, Нетскейпа смучеше яко.
BornToDrink
24.10.08 г., 02:37
Схванах, само да не подхващаме темата за браузърите. :P
Иначе за "как ще я интерпретираш и обработиш с JS, когато се върне в браузъра, си е твоя работа." баш тука ми е проблема. :D
А ако под Лебове, имаш предвид Уеб, то и аз между другото се занимавам сега, иначе работата се отклонява от тая посока. :)
Bombera
24.10.08 г., 02:44
Уеб-ове, да :)
Ами примерно скриптът от сървъра връща стринг "1" за валидна информация, и "0" за невалидна.
и
switch(stringa_ot_servera){
case "0":
izwyrshi_deistwiq_ako_dannite_sa_OK();
break;
case "1":
izwyrshi_deistwiq_ako_dannite_smuchat_de mek_sa_newalidni();
break;
}
Сега, друг е въпросът вече какво искаш тия двете функции с дългите имена да правят.
Авторски права на vBulletin