Титла: [JavaScript] чекбокс -> радиобутон задача Публикувано от: philip_petev в Nov 21, 2012, 14:30 Не съм сигурен дали точно тук трябва да питам за това, но ето за какво става въпрос: опитвам се да направя функция която да връща като (булев) резултат от определено свойство на няколко обекта (което също е от булев тип), навързани помежду си с логическо И. Стигнах до там да направя loop който да генерира следното условие под формата на стринг (примера е за кода необходим на обект installer_choice_2_5) :
Цитат !choices.installer_choice_2_1.selected || !choices.installer_choice_2_2.selected || !choices.installer_choice_2_3.selected || !choices.installer_choice_2_4.selected || !choices.installer_choice_2_6.selected || !choices.installer_choice_2_7.selected || !choices.installer_choice_2_8.selected || !choices.installer_choice_2_9.selected || !choices.installer_choice_2_10.selected || !choices.installer_choice_2_11.selected || !choices.installer_choice_2_12.selected въпросните installer_choice_x_y са имената на инсталационите опции, сочещи към компоненти от тип чекбокс и selected е положението на чекбокса (избран или не, тоест булев тип), а choices e главния обект, който обикновено съдържа списъка с имената на отделните инсталационни опции. Аз в момента се опитвам да направя нещо като да го накарам да работи като радиобутон, защото в средата в която се намира, а именно инсталационните пакети на OS X (зависимостите между инсталационните опции в тях се определят посредством JavaScript скриптове), няма такъв контрол и след поставяне на подобна функция на всеки компонент от менюто, той би трябвало да работи като радиобутон (и той в действителност работи по този начин с такъв код, пробвано е), тоест при избран друг, този да се деселектира, но понеже опциите са твърде много (това е една от седемте групи опции), реших да го направя с обща функция на която само задаваш подходящите входящи параметри, вместо с писане на отделна функция за всяка отделна опция (надявам се че го обясних на разбираем език). Но да се върнем на горния израз - стигнах до положение да ми генерира стринг от горния вид и понеже фунцията която го генерира трябва да връща булев резултат от горния ред, си мислех да го пусна през стандартната функция eval(), като за по-мързелив начин, но чета по други места че този начин не се препоръчвал и освен това бил по-бавен за изпълнение в сравнение с алтернативите. Та питането ми е, кои са възможните алтернативи за решаване на тази задача и има ли смисъл да ги ползвам вместо eval()? Титла: Re: [JavaScript] чекбокс -> радиобутон задача Публикувано от: b2l в Nov 21, 2012, 14:58 Човек, аз нищо не разбрах от това какво правиш, но въпреки всичко този output който си показал ми се струва много грешен като логика.
Титла: Re: [JavaScript] чекбокс -> радиобутон задача Публикувано от: philip_petev в Nov 21, 2012, 15:15 Човек, аз нищо не разбрах от това какво правиш, но въпреки всичко този output който си показал ми се струва много грешен като логика. Да, прав си, вместо || (ИЛИ) e && (И). Ето как изглежда функцията за определена опция за да работи като радиобутон: Код
&& = && 2_1 значи втора група, първа опция, това са условни названия. Функцията връща булев резултат в зависимост от условието, а то в случая ще е всички останали от групата да не са селектирани. Тази функция се слага на свойството selected на всяка опция от групата (като се променя в съответствие с това за коя опция става дума и съответно в списъка се слагат инвертирано свойството selected на всички останали). Сега стана ли по-ясно? Има тагове за код (без и със указан език), мисля, че е най-добре да използваш тях и визуализацията ще се оправи. bop_bop_mara Титла: Re: [JavaScript] чекбокс -> радиобутон задача Публикувано от: b2l в Nov 21, 2012, 15:33 Не можеш ли на функция choice_selected() да попдадеш параметър и вътре с един switch/case и да видиш потребителя какво си е избрал? И така и не ми стана ясно какво ще даваш на eval()...
Титла: Re: [JavaScript] чекбокс -> радиобутон задача Публикувано от: philip_petev в Nov 21, 2012, 15:47 Не можеш ли на функция choice_selected() да попдадеш параметър и вътре с един switch/case и да видиш потребителя какво си е избрал? И така и не ми стана ясно какво ще даваш на eval()... Това беше първия ми опит, само че нали се сещаш че броя на кейсовете нараства пропорционално на броя опции за които трябва да е валидно условието на радиобутона (както и броя на елементите за изключване във всеки кейс) и нали се сещаш как би изглеждала функция с кейсове за вариант с 4 опции в група и за 15+ опции в група (защото имам и такава). Много по-бързо и по-лесно става да генерирам условието като стринг с два loop-а, първия генерира списъка на елементите с номера преди текущия, а втория с номерата след текущия, като задаваш като втори параметър и колко е общия им брой и точно това е резултата който виждаш в първия пост (това, което ще давам на eval()). Титла: Re: [JavaScript] чекбокс -> радиобутон задача Публикувано от: neter в Nov 21, 2012, 16:06 И така и не ми стана ясно какво ще даваш на eval()...Въпросното условие, което е генерирал philip_petev, е стринг (както всяко едно навързване на текст), и за да се чете като код, трябва да мине през eval(). По-прост пример Цитат var1 = 'var2 != 1';Тук в if-а няма да се направи проверка дали стойността на var2 е различна от 1, а ще се направи проверка върху var1, което не е това, което искаме. За да се направи проверка дали var2 е различна от 1, тогава става Цитат var1 = 'var2 != 1'; Та питането ми е, кои са възможните алтернативи за решаване на тази задача и има ли смисъл да ги ползвам вместо eval()?Не се сещам кои ще да са тези алтернативи на eval() (не пише ли там, където четеш препоръката?), а и не виждам какъв е проблемът да се изпълнява eval(). JavaScript кодът е видим на клиентската машина, така че, ако потребителят има желание, няма никакъв проблем да промени действията в кода, независимо ползва ли се или не се ползва eval(). Т.е., причината за препоръката едва ли е откъм сигурност. Предполагам, че е по-скоро откъм допускане на бъгове в кода, но... това така или иначе си е относителна работа. Моята препоръка за алтернатива е, щом ти се налага да пишеш по-сложни условия, да зарежеш писането на чист JavaScript и да минеш на jQuery или някой друг такъв framework. Изписаният от теб код ще бъде по-кратък, по-красив, по-стабилен, като ще се сведе до минимум и чуденето "това дали ще работи под всички браузъри" (чистият Javascript често води до този въпрос), тъй като разработчиците на дадения framework имат грижата за това. С jQuery твоето условие би могло да се сведе до нещо като това Цитат if (!$('input[id^="choices.installer_choice_2"]').is(':checked')) {без допълнителни цикли за генериране на списъка с условия за всички елементи, без eval()... чисто и лесно :) Титла: Re: [JavaScript] чекбокс -> радиобутон задача Публикувано от: philip_petev в Nov 21, 2012, 16:27 Не се сещам кои ще да са тези алтернативи на eval() (не пише ли там, където четеш препоръката?), а и не виждам какъв е проблемът да се изпълнява eval(). JavaScript кодът е видим на клиентската машина, така че, ако потребителят има желание, няма никакъв проблем да промени действията в кода, независимо ползва ли се или не се ползва eval(). Т.е., причината за препоръката едва ли е откъм сигурност. Предполагам, че е по-скоро откъм допускане на бъгове в кода, но... това така или иначе си е относителна работа. Не точно препоръки, по-точно заместващи техники, но ми се видяха че бих усложнил прекалено много кода с тях, а в конкретния случай не си струва. Съображения на авторите на тези постове бяха точно от гледна точка на сигурността и може би са основателни, когато става въпрос за среда на изпълнение на кода "браузър". Езика няма как да го сменя, просто това е езика, който е заложен в Mac OS X Install framework (който ползват инсталационните пакети), нито пък ще има чуденета от рода "това дали ще работи на всички браузъри", защото в случая клиента не е браузър, а един фреймуорк с вграден JavaScript интерпретатор, а бъгове в кода едва ли чак толкова ще се допускат, защото в случая става въпрос за един булев резултат който трябва да се пресметне по условие и да се върне. Ясно, разбрах картинката. Благодаря за отговорите. |