хъ
ЖуК>З.Ы. Для меня — это выход, потому что это увеличит мою производительность, как программиста, в N раз
Тогда производительность ASP.NET девелоперов тебе даже не сниться, так как там все скрипты уже написаны, а описанный тобой подход используется на 200%.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, anonymous, Вы писали: A>>behaviours ведь только в IE... S>Ничего, не расстраивайся — попытки сделать DHTML кроссбраузер-совместимым вполне доведут тебя до седых волос, половина браузеров все равно будет игнорировать самые вкусные вещи, и при этом ты обнаружишь, что дополнительная, по сравнению с IE, совместимость увеличила твою аудиторию ажно процента на полтора...
Ну, по крайней мере, эту задачу можно сделать выполнимой в последних версиях браузеров.
Файл main.js (Организует вызов функций по window.onload):
String.prototype.trim = function() { return this.replace(/(^\s+|\s+$)/g, ""); }
var arrOnLoadFunk = [];
window.onload = function() {
for ( var i = 0; i < arrOnLoadFunk.length; i++ ) arrOnLoadFunk[i]();
}
function addOnLoadFunk( fnk ){
arrOnLoadFunk[ arrOnLoadFunk.length ] = fnk;
}
Сам файл проверки форм check.js:
// добавляем hendlerFormInit в список функций вызываемых по onload
addOnLoadFunk( hendlerFormInit );
// вешаем обработчики события onsubmit для форм
function hendlerFormInit() {
for ( var i = 0; i < document.forms.length; i++ ) {
document.forms[i].onsubmit = hendlerForm;
}
}
// обработчик события onsubmit для формы
function hendlerForm( ev ){
var frm = this; // вызывающая форма
for( var i = 0; i < frm.elements.length; i++ ) {
var element = this.elements[i];
var hendler = window[ 'feHendler_' + element.getAttribute('logicalType') ];
if( hendler + '' != 'undefined' ){
if( hendler( element ) ) return false;
}
}
return true;
}
// функция вывода сообщения об ошибке
function showError( e, message ){
alert( message );
e.focus();
return true;
}
// Обработчик для logicalType = mail
function feHendler_mail( e ) {
var val = e.value.trim();
if( val.length > 0 || e.getAttribute('required') == 'yes' ){
var reg_exp = /^[a-z][\w\.]*@[\w\.]+\.[a-z]{2,4}/i;
if( !reg_exp.test( e.value)) {
return showError( e, 'Введен некорректный e-mail адрес!' )
}
}
e.value = val;
return false;
}
// Обработчик для logicalType = textfield
function feHendler_textfield( e ) {
var val = e.value.trim();
var len = val.length;
var viewName = '"' + e.getAttribute('viewName') + '"';
if( e.getAttribute('required') == 'yes' && len == 0 )
return showError( e, 'Не заполнено поле ' + viewName + '!' );
if( len != 0 ) {
var minlength = parseInt( e.getAttribute('minlen'), 10);
if( isNaN( minlength ) ) minlength = 0;
if( len < minlength )
return showError( e, 'Слишком короткое значение поля ' + viewName + '!\nМинимальное количество символов - ' + minlength + '.');
var maxlength = parseInt( e.getAttribute('maxlen'), 10);
if( isNaN( maxlength ) ) minlength = 9999999;
if( len > maxlength )
return showError( e, 'Слишком большое значение поля ' + viewName + '!\nМаксимальное количество символов - ' + maxlength + '.');
}
e.value = val;
return false;
}
Для реализации нового типа logicalType, например MyType, необходимо просто написать функцию feHendler_MyType( e ) возращающую в случае ошибки true, иначе — false
Данный код отработал без проблем в следующих браузерах:
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, ЖуК, Вы писали:
S>А насчет behaviours ты не смотрел? В принципе, ничего особо нового там нет. Просто привязка событий и обработчиков там выполнена декларативно (а не императивно, как у тебя). А в остальном — все ровно то же самое. Custom attributes — и вперед с пестней. S>Вообще все так делают. У нас вот например ездит textarea с атрибутом maxlength.
behaviours слишком уж специфичны тем, что работают только в ИЕ. А мне очень часто приходится писать именно под Мозилу. Чаще всего задачи — это локальные приложения, основанные на веб. И, как правило, заказчик говорит — мне надо так: "Винду нах, линукс грузим по сети на места операторов, из программ у них — Мозила в автозагрузке на весь экран. И все — бабла за ОС не плачу. Люди заняты только работой. Обращаться с компом просто — кнопочкой павер он/офф. Все!". И он прав — это дешевле.
Но и для ИЕ писать приходится. Так что получается мне каждый раз нужно использовать разные подходы — для ИЕ — behaviours, для Mozilla — XBL... А так я, основываясь на одном подходе, могу обеспечить кроссбраузерность чуть ли не одной проверкой (очень часто в простейших задачах сам код одинаковый, а почему как минимум одной — читай ниже).
С другой стороны, если уж очень большие различия в коде для какой- то задачи — их можно просто разделить по браузерам, грузить ОДНУ, но УМНУЮ либу, которая сама подключит необходимую, например, через
document.write( '<' + 'Script...
для нужного браузера...
И третье — речь идет, в первую очередь, об избавлении от рутины для простейших, но часто встречающихся задач задач...
S>З.Ы. Ты обратил внимание, что твой код непригоден при наличии в форме более одного класса объекта, требующего pre-submit обработки? Так что надо их chain-ить (как, впрочем, и onload для окна).
Конечно обратил.. я ведь говорил, что это пример, причем решающий ОДНУ ЗАДАЧУ Да, валидней было бы использовать для ИЕ — attachEvent, для Мозилы — addEventListener... и ве будет ОК. Вообщем, я ни в чем никого не пытаюсь убедить... как делать — дело лично каждого
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, anonymous, Вы писали: A>>behaviours ведь только в IE... S>Ничего, не расстраивайся — попытки сделать DHTML кроссбраузер-совместимым вполне доведут тебя до седых волос, половина браузеров все равно будет игнорировать самые вкусные вещи, и при этом ты обнаружишь, что дополнительная, по сравнению с IE, совместимость увеличила твою аудиторию ажно процента на полтора...
я это несколько иначе использую... )
например, в MSIE криво реализована обработка CSS... в частности не работает должным образом псевдо-класс :hover... так вот для нормальных (в отношении CSS) браузеров стили описываются как положено в :hover, а для MSIE пишется .htc-файл обрабатывающий onMouseOver/onMouseOut и путь к нему указывается в атрибуте behavior...
Re[8]: Компоненты, расширяющие функциональность HTML кода :)