Автор Тема: [JavaScript] чекбокс -> радиобутон задача  (Прочетена 2896 пъти)

philip_petev

  • Напреднали
  • *****
  • Публикации: 20
  • Distribution: Linux Mint 10 x64
  • Window Manager: Gnome
    • Профил
Не съм сигурен дали точно тук трябва да питам за това, но ето за какво става въпрос: опитвам се да направя функция която да връща като (булев) резултат от определено свойство на няколко обекта (което също е от булев тип), навързани помежду си с логическо И. Стигнах до там да направя 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()?
« Последна редакция: Nov 21, 2012, 14:34 от philip_petev »
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: [JavaScript] чекбокс -> радиобутон задача
« Отговор #1 -: Nov 21, 2012, 14:58 »
Човек, аз нищо не разбрах от това какво правиш, но въпреки всичко този output който си показал ми се струва много грешен като логика.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

philip_petev

  • Напреднали
  • *****
  • Публикации: 20
  • Distribution: Linux Mint 10 x64
  • Window Manager: Gnome
    • Профил
Re: [JavaScript] чекбокс -> радиобутон задача
« Отговор #2 -: Nov 21, 2012, 15:15 »
Човек, аз нищо не разбрах от това какво правиш, но въпреки всичко този output който си показал ми се струва много грешен като логика.

Да, прав си, вместо || (ИЛИ) e && (И). Ето как изглежда функцията за определена опция за да работи като радиобутон:

Код
GeSHi (Javascript):
  1. function choice_2_1_selected()
  2. {
  3. var tSelected;
  4. tSelected=(!choices.installer_choice_2_2.selected
  5. && !choices.installer_choice_2_3.selected
  6. && !choices.installer_choice_2_4.selected
  7. && !choices.installer_choice_2_5.selected
  8. && !choices.installer_choice_2_6.selected
  9. && !choices.installer_choice_2_7.selected);
  10. return (tSelected && my.choice.selected);
  11. }

&& = &&

2_1 значи втора група, първа опция, това са условни названия. Функцията връща булев резултат в зависимост от условието, а то в случая ще е всички останали от групата да не са селектирани. Тази функция се слага на свойството selected на всяка опция от групата (като се променя в съответствие с това за коя опция става дума и съответно в списъка се слагат инвертирано свойството selected на всички останали). Сега стана ли по-ясно?

Има тагове за код (без и със указан език), мисля, че е най-добре да използваш тях и визуализацията ще се оправи.
bop_bop_mara
« Последна редакция: Nov 22, 2012, 14:36 от philip_petev »
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: [JavaScript] чекбокс -> радиобутон задача
« Отговор #3 -: Nov 21, 2012, 15:33 »
Не можеш ли на функция choice_selected() да попдадеш параметър и вътре с един switch/case и да видиш потребителя какво си е избрал? И така и не ми стана ясно какво ще даваш на eval()...
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

philip_petev

  • Напреднали
  • *****
  • Публикации: 20
  • Distribution: Linux Mint 10 x64
  • Window Manager: Gnome
    • Профил
Re: [JavaScript] чекбокс -> радиобутон задача
« Отговор #4 -: Nov 21, 2012, 15:47 »
Не можеш ли на функция choice_selected() да попдадеш параметър и вътре с един switch/case и да видиш потребителя какво си е избрал? И така и не ми стана ясно какво ще даваш на eval()...

Това беше първия ми опит, само че нали се сещаш че броя на кейсовете нараства пропорционално на броя опции за които трябва да е валидно условието на радиобутона (както и броя на елементите за изключване във всеки кейс) и нали се сещаш как би изглеждала функция с кейсове за вариант с 4 опции в група и за 15+ опции в група (защото имам и такава). Много по-бързо и по-лесно става да генерирам условието като стринг с два loop-а, първия генерира списъка на елементите с номера преди текущия, а втория с номерата след текущия, като задаваш като втори параметър и колко е общия им брой и точно това е резултата който виждаш в първия пост (това, което ще давам на eval()).
« Последна редакция: Nov 21, 2012, 15:51 от philip_petev »
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: [JavaScript] чекбокс -> радиобутон задача
« Отговор #5 -: Nov 21, 2012, 16:06 »
И така и не ми стана ясно какво ще даваш на eval()...
Въпросното условие, което е генерирал philip_petev, е стринг (както всяко едно навързване на текст), и за да се чете като код, трябва да мине през eval(). По-прост пример
Цитат
var1 = 'var2 != 1';
if (var1)
   alert('yes');
Тук в if-а няма да се направи проверка дали стойността на var2 е различна от 1, а ще се направи проверка върху var1, което не е това, което искаме. За да се направи проверка дали var2 е различна от 1, тогава става
Цитат
var1 = 'var2 != 1';
if (eval(var1))
   alert('yes');


Та питането ми е, кои са възможните алтернативи за решаване на тази задача и има ли смисъл да ги ползвам вместо eval()?
Не се сещам кои ще да са тези алтернативи на eval() (не пише ли там, където четеш препоръката?), а и не виждам какъв е проблемът да се изпълнява eval(). JavaScript кодът е видим на клиентската машина, така че, ако потребителят има желание, няма никакъв проблем да промени действията в кода, независимо ползва ли се или не се ползва eval(). Т.е., причината за препоръката едва ли е откъм сигурност. Предполагам, че е по-скоро откъм допускане на бъгове в кода, но... това така или иначе си е относителна работа.
Моята препоръка за алтернатива е, щом ти се налага да пишеш по-сложни условия, да зарежеш писането на чист JavaScript и да минеш на jQuery или някой друг такъв framework. Изписаният от теб код ще бъде по-кратък, по-красив, по-стабилен, като ще се сведе до минимум и чуденето "това дали ще работи под всички браузъри" (чистият Javascript често води до този въпрос), тъй като разработчиците на дадения framework имат грижата за това. С jQuery твоето условие би могло да се сведе до нещо като това
Цитат
if (!$('input[id^="choices.installer_choice_2"]').is(':checked')) {
   .........
}
без допълнителни цикли за генериране на списъка с условия за всички елементи, без eval()... чисто и лесно :)
« Последна редакция: Nov 21, 2012, 16:08 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

philip_petev

  • Напреднали
  • *****
  • Публикации: 20
  • Distribution: Linux Mint 10 x64
  • Window Manager: Gnome
    • Профил
Re: [JavaScript] чекбокс -> радиобутон задача
« Отговор #6 -: Nov 21, 2012, 16:27 »
Не се сещам кои ще да са тези алтернативи на eval() (не пише ли там, където четеш препоръката?), а и не виждам какъв е проблемът да се изпълнява eval(). JavaScript кодът е видим на клиентската машина, така че, ако потребителят има желание, няма никакъв проблем да промени действията в кода, независимо ползва ли се или не се ползва eval(). Т.е., причината за препоръката едва ли е откъм сигурност. Предполагам, че е по-скоро откъм допускане на бъгове в кода, но... това така или иначе си е относителна работа.
Моята препоръка за алтернатива е, щом ти се налага да пишеш по-сложни условия, да зарежеш писането на чист JavaScript и да минеш на jQuery или някой друг такъв framework. Изписаният от теб код ще бъде по-кратък, по-красив, по-стабилен, като ще се сведе до минимум и чуденето "това дали ще работи под всички браузъри" (чистият Javascript често води до този въпрос), тъй като разработчиците на дадения framework имат грижата за това. С jQuery твоето условие би могло да се сведе до нещо като това
Цитат
if (!$('input[id^="choices.installer_choice_2"]').is(':checked')) {
   .........
}
без допълнителни цикли за генериране на списъка с условия за всички елементи, без eval()... чисто и лесно :)

Не точно препоръки, по-точно заместващи техники, но ми се видяха че бих усложнил прекалено много кода с тях, а в конкретния случай не си струва. Съображения на авторите на тези постове бяха точно от гледна точка на сигурността и може би са основателни, когато става въпрос за среда на изпълнение на кода "браузър". Езика няма как да го сменя, просто това е езика, който е заложен в Mac OS X Install framework (който ползват инсталационните пакети), нито пък ще има чуденета от рода "това дали ще работи на всички браузъри", защото в случая клиента не е браузър, а един фреймуорк с вграден JavaScript интерпретатор, а бъгове в кода едва ли чак толкова ще се допускат, защото в случая става въпрос за един булев резултат който трябва да се пресметне по условие и да се върне. Ясно, разбрах картинката. Благодаря за отговорите.
Активен