Az problémám, hogy 2x bindelődik az inputok textchange eseményére a bennük található függvény. De miért?? :SSSS Nem értem, ha valaki tudja, hogy mit rontok el akkor pls. árulja már el. Köszi.
Szerintem a bemásolt kódrészlet semmiben sem utal arra, hogy egy elemhez egynél többször bindolódna egy handler. Mindazonáltal vannak még ha működő is, de csúnya részek.
Pl. a setFieldOk első négy sora helyett ez sokkal szebb (szerintem):
jArray[inputName] = ok;
A $.each -nek átadott függvény két paramétere a tömbindex és a tömbérték lesz. Ez esetben a tömb, amin végiglépked a pfields1. Itt az, hogy összeadod a kulcsot az értékkel (stringet bool-al), az nem tudom, mit eredményez, de nem hiszem, hogy pont erre van szükséged.
A hibát szerintem ne (csak) ebben a kódrészletben keresd. Lehet, hogy ez a js kétszer van behúzva, vagy egy függvényben van, ami kétszer fut le, stb.
Na ilyenkor megy el az ember kedve a programozástól.
Ír egy elég normális kódot, amiben van egy apró hiba, de nem blődség az egész, és segítséget kér. Erre jön valaki, aki úgy gondolja, hogy sz.r az egész, átírja. Átnevezi a változókat is, mert neki az nem szimpatikus. Aztán úgy gondolja, hogy még fényezi magát, így ír egy egész keretrendszert, és a pofájába dörgöli, hogy nesze, ennyire hulladék, amit te csináltál.
Mellesleg megjegyzem, az ilyenek miatt van az, hogy quadcore proci kell már egy hello word-höz is, mert az emberek elfelejtettek egyszerű kódot írni, tőccsünk le egy fél vindózt azért, hogy megtudjuk, szerencsétlen input mező ki van-e töltve.
Ennyiről beszélünk eredetileg:
if (document.getElementById('passuname1').val != '')
Ha dicsekedni akarsz, lehet, de próbáld meg ne úgy tenni, hogy másba belerúgsz.
Nézz utána java collections framework-nek, abban van néhány alap gyűjtemény, amiket érdemes használni, vagy kiterjeszteni. Sajnos javascript oo szempontjából nem a legkedvezőbb...
Úgy nagyjából amiket érdemes ismerni:
List - A javascript tömbnek felel meg, szám index-ek vannak benne, minden index-hez tartozik egy érték.
Set - Egyedi értékeket tárol, nincsenek index-ei. Pl. egy javascript objektumnak keySet-je van, mert minden kulcs csak egyszer szerepelhet. Ha objektumok vannak a Set-ben, akkor egyedi azonosítót szoktak kérni, ezt hashCode-nak hívják, és megnézik, hogy az egyedi azonosító szerepel e már a gyűjteményben. A gyűjteményt ilyenkor HashSet-nek nevezik. A probléma ott van, hogy DOM objektumoknál az internet explorer-ben nem lehet HashSet-et készíteni, mert nem lehet semmilyen tulajdonságot beállítani rajtuk. DOM objektumokból egyedül úgy készíthető Set, ha végigmész az összes addig hozzáadott elemen, és mindegyikre megnézed, hogy nem egyezik e meg az újonnan hozzáadandó elemmel. Ez rohadt lassú kódot eredményez, emiatt egyszerűbb nem biztosítani a Set-nél, hogy minden csak egyszer szerepelhet. (Annak idején úgy döntöttem, hogy amíg ez a probléma fennáll, addig nem vagyok hajlandó érdemben javascripttel foglalkozni.)
Map - Gyakorlatilag egy sima javascript object-nek felel meg. Kulcs-érték párokból áll, a kulcsok egyediek minden értékhez. Persze lehet HashMap-et is csinálni, ilyenkor a kulcsok objektumok.
Ezek alapján a FieldSet-et ki lehet cserélni egy sima tömbre, amit FieldList-nek hívsz, felesleges emiatt egy külön osztály, amikor js úgysem támogatja a Set-eket. A Field-et én szétbontanám AbstractField-re, InputField-re és SelectField-re, így megszűnnének benne az isSelectInput-os if-ek. A submitButton-nak is adnék egy külön osztályt, ami az enable/disable dolgokat csinálja rajta.
Szóval még lenne mit javítani a kódon. Én a helyedben elkezdenék ismerkedni az objektum orientált programozással. Ha tudsz angolul, akkor olvasd el a Clean Code című könyvet miután már ismered az alapokat. Ha nem tudsz angolul, akkor keress valamit, amiben elmagyarázzák az absztrakciós szinteket, pl: ebben írnak róluk (nem olvastam, nem tudom mennyire érthetően).
Ha mégsincs kedved oo-t tanulni, akkor van néhány szabály, amit érdemes betartani:
- használj beszélő neveket, amik leírják, hogy mit tartalmaz egy változó, vagy mit csinál egy függvény, kerüld a $-t meg a speciális karaktereket a változónevekben, zavaróak...
- switch helyett érdemes if-else -t használni, vagy ha van rá lehetőség, akkor egy Map-et, aminek a kulcsai a switch case-ei
switch( $('#'+inputName).get(0).tagName ) { case 'SELECT': var test = 0; var binding = 'change' break; default: var binding = 'textchange' var test = ''; }
=>
var binding = 'textchange'; var test = ''; var isSelectInput = ($('#'+inputName).get(0).tagName == "SELECT"); if (isSelectInput) { test = 0; binding = 'change'; } else { test = ''; binding = 'textchange'; }
=>
var tagMap = { SELECT: {test: 0, binding: "change"}, INPUT: {test: "", binding: "textchange"} }; var inputTag = $('#'+inputName).get(0).tagName; var params = tagMap[inputTag]; var test = params.test; var binding = params.binding;
- kerüld a hosszú paraméter listákat, helyettük adj át egy map-et (sima javascript objektum), aminél a kulcsok a paraméterek nevei (minél hosszabb egy lista, annál könnyebb elfelejteni, hogy milyen sorrendben vannak benne a paraméterek)
function passwordInputsManage(jArray,inputName,submitName) { //... } passwordInputsManage(pfields1, 'passuname1', 'remindque');
=>
function passwordInputsManage(params) { var jArray = params.jArray; var inputName = params.inputName; var submitName = params.submitName; //... } passwordInputsManage({ jArray: pfields1, inputName: 'passuname1', submitName: 'remindque' });
- kerüld a blokkok egymásba ágyazását (pl if-ben egy switch, stb...), és a hosszú blokkokat. az összes ilyen blokk belseje kiemelhető külön függvénybe
ilyen nem volt a kódodban ...
- kerüld az ismétlődést, ha ismétlődik egy kód, az arra utal, hogy nem a megfelelő helyen van
var $currElement = $('#'+inputName); switch( $('#'+inputName).get(0).tagName ) {...}
=>
var $currElement = $('#'+inputName); switch( currElement.get(0).tagName ) {...}
vagy
$currElement.bind(binding,function(){ var bool = $(this).val() != test ? true : false; setFieldOk(jArray, inputName, submitName, bool); }) setFieldOk(jArray, inputName, submitName, ( $currElement.val() != test ? true : false ));
=>
var validateInput = function (){ var bool = $(this).val() != test ? true : false; setFieldOk(jArray, inputName, submitName, bool); }; $currElement.bind(binding, validateInput); validateInput.call($currElement);
Ne használj eval-t, sosincs rá szükség.
if ( ok ) eval("jArray." + inputName + "=true"); else eval("jArray." + inputName + "=false");
=>
jArray[inputName] = ok;
Alert-es hibakeresés helyett inkább sűrűbben ellenőrizd a paraméterek és változók helyességét, és dobjál kivételt, ha valami nem stimmel. Ha nagy a kódod, és kevés ellenőrzés van benne, akkor végig kell nézned az egészet alert-tel, mire megtalálod, hogy egy változó hol kapott hibás értéket...
var $currElement = $('#'+inputName); switch( $('#'+inputName).get(0).tagName ) { ... }
=>
var $currElement = $('#'+inputName); if (!$currElement.length) throw new Error("Cannot find input: "+inputName); switch( $('#'+inputName).get(0).tagName ) { ... }
Mielőtt saját kódot írsz érdemes utánakeresni, hogy a keretrendszer, amit használsz nem e támogatja amit akarsz, vagy hogy nem e írta meg már valakit ugyanazt. Bár nem ismerem a jquery-t, de meglepődnék, ha nem lenne benne valami isEmpty, vagy ilyesmi az input-okra. Elég nagy keretrendszer... A leírása sajnos pocsék.
Egyébként nem hiszem, hogy járna a pont, mert semmi olyat nem írtam, ami a bind duplikálást megoldotta volna. Valószínűleg nem is volt jelen, lehet, hogy csak az zavart be, hogy hibás volt a setFieldOk-os sorod.