Dzięki za odpowiedź Panowie.
Napisałem już dość sporo działających wtyczek i innych rzeczy pomocy jQuery także zdaje mi się, że podstawy już znam.
Żeby lepiej pokazać o co mi chodzi napisze co robiłem ostatnio:
Napisałem wtyczkę do jQuery (kod mam w pracy, jutro wrzucę) która nazywa się Validate.
Potrzebowałem aby konkretne pola konkretnych formularzy były walidowane tylko w konkretnych przypadkach dynamicznie.
Ostatecznie działa to tak, że powiedzmy mamy formularz (#loginForm) na stronie z dwoma polami - email, hasło:
oValidate = new Validate('loginForm')
oValidate.add('inputEmail', 'email') // pierwszy parametr to nazwa pola, drugi to typ walidacji, jeśli nie podamy typu walidacji to załaduje się domyślny noEmpty
W tym momencie jeśli spróbujemy dać submit albo blur na inpucie klasa Validate odpala domyślny komunikat przy polu o błędnych danych, dla każdego pola możemy też przypisać konkretny komunikat.
oValidate.remove('inputEmail') // a ta linia powoduje, że pole nie jest już walidowane, sensu niby nie ma ale to tylko przykład. W procesie zamówienia który tworze takie rozwiązanie jest niezbędne.
Problemy zaczęły pojawiać się, gdy na stronie pojawiały się 2 formularze. Mają działać pod klasą Validate bez kolidacji, to właśnie miałem na myśli mówiąc o wielo-instancyjności, czyli raczej odwrotności singletona. Problem wyglądał tak że nie dawało się kliknąć w submit jeśli w którymkolwiek formularzu coś się nie walidowało.
Z tym też sobie poradziłem, ale raczej metodą prób i błędów tworząc kod którego nie rozumiem dlatego postanowiłem założyć ten temat. Wciąż nie rozumiem return this.each... each to jak mniemam pętla po wszystkich "obiektach obiektu" (tak mi się przynajmniej wydaje) także jaki jest sens takiego zapisu? Wierzę , że jak to zrozumiem to zrozumiem i resztę.
Jak mówiłem, wrzucam kod:
(function($) {
var m_oDefaults = {
nTestSetting: 0,
sTestSetting: 'test',
ExtraInitFunction: null,
formName: null
};
var initExampleHelperFunction = function(oElement){
self = m_aoFunctions;
oElement.find('input').on('blur', function(){
return self.blur($(this).attr('name'), oElement);
});
oElement.find('input[type="submit"]').on('click', function(){
return self.checkAll(oElement);
});
};
var m_aoFunctions = {
init: function(oOptions){
oOptions = $.extend({}, m_oDefaults, oOptions);
return this.each(function() {
var oElement = $(this);
oElement.data('validate', {
pluginoptions: oOptions,
fields: []
});
// init operations....
initExampleHelperFunction(oElement);
if(null != oElement.data('validate').pluginoptions.ExtraInitFunction){
oElement.data('validate').pluginoptions.ExtraInitFunction();
}
});
},
myInit: function(formName) {
},
option: function(oOptions){
$.extend($(this).data('validate').pluginoptions, oOptions);
},
getTestSettingText: function(){
return $(this).data('validate').pluginoptions.sTestSetting;
},
add: function(fieldName, validationType) {
if (!$('input[name="'+fieldName+'"]').length) return false;
if (typeof validationType == "undefined") validationType = 'noEmpty';
this.remove(fieldName); // jakby przypadkiem to pole było już walidowane
$(this).data('validate').fields.push({fieldName: fieldName, validationType: validationType, formName: this.formName});
return this;
},
remove: function(name) {
var flds = $(this).data('validate').fields;
for (i in flds) {
if (flds[i].fieldName == name) {
$(this).data('validate').fields.splice(i,1);
console.log('Spliced element: '+i+ ' => '+name)
}
}
},
getFields: function(oElement) {
if (typeof oElement != "undefined")
return oElement.data('validate').fields;
},
blur: function(field,oElement) {
this.oElement = oElement;
var f = 0, fields = this.getFields(oElement);
for (i in fields) {
if (fields[i].fieldName == field) {
if (!this.check(oElement.data('validate').fields[i].fieldName, oElement.data('validate').fields[i].validationType)) {
f++;
}
}
}
return !f;
},
check: function(fieldName, validationType) {
field = this.oElement.find('input[name="'+fieldName+'"]');
return eval('this.'+validationType+'(field)');
},
checkAll: function(oElement) {
var f = 0, fields = this.getFields(oElement);
this.oElement = oElement;
for (i in fields) {
if (!this.check(oElement.data('validate').fields[i].fieldName, oElement.data('validate').fields[i].validationType)) {
f++;
}
}
return !f;
},
isObserved: function(name) {
for (i in oElement.data('validate').fields) {
if (oElement.data('validate').fields[i].fieldName == name) {
return true;
}
}
return false;
},
email: function(field) {
self = this;
var errorSpan = this.oElement.find('.'+field.attr('name')+'.error-info');
var regex = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
if ( !regex.test(field.val()) ) {
errorSpan.show();
return false;
} else {
errorSpan.hide();
return true;
}
},
password: function(field) {
self = this;
var errorSpan = $('.'+field.attr('name')+'.error-info');
if ( !field.val().length ) {
errorSpan.show();
return false;
} else {
errorSpan.hide();
return true;
}
},
radio: function(field) {
var errorSpan = $('.deliveryAddress.error-info');
if (!field.is(':checked')) {
errorSpan.show();
return false;
} else {
errorSpan.hide();
return true;
}
},
noEmpty: function(field) {
self = this;
var errorSpan = $('.'+field.attr('name')+'.error-info');
if ( !field.val().length ) {
errorSpan.show();
return false;
} else {
errorSpan.hide();
return true;
}
}
};
$.fn.validate = function(oFunction) {
if (m_aoFunctions[oFunction]) {
return m_aoFunctions[oFunction].apply(this, Array.prototype.slice.call(arguments, 1));
} else if ((typeof oFunction === 'object') || !oFunction) {
return m_aoFunctions.init.apply(this, arguments);
} else {
$.error('Funkcja ' + oFunction + ' nie istnieje w przestrzenii jQuery.myplugin');
}
};
})(jQuery);
Przykłady użycia:
$validatorAddresses = $('form[name="addresses"]').validate();
$validatorAddresses.validate('add', 'deliveryAddress', 'radio'); // czyli konieczność wyboru któregoś adresu z radio
$validatorAddresses.validate('remove', 'deliveryAddress'); // usuniecie z walidacji
Trochę się to różni od tego co napisałem wczoraj. Coś mi sie widać popieprzyło.
Moje szczere oczekiwania odnośnie tego tematu są takie, że ktoś napisze: "Co żeś napisał, powinieneś to zrobić inaczej"...
Pozdrawiam.