PDA

View Full Version : مشکل در trim کردن یک string



engmmrj
شنبه 09 شهریور 1392, 18:58 عصر
سلام ، من یک تابع نوشتم که وقتی درون text box خالی بود دور text box قرمز شود تابع کار می کند فقط وقتی کسی space میزنه باعث میشه که اون text box رو خالی در نظر نگیره ، تابع:


function valid_box(id)
{
count = id.length-1 ;
status = true ;
for( i = 0 ; i <= count ; i++ )
{
$('#'+ id[i] ).trim ;
if( $('#'+ id[i] ).val() == "")
{
$('#'+ id[i] ).css({'border-color':'#F00'});
status = false ;
}
else
$('#'+ id[i] ).css({'border-color':'#CCC'});
}
return status ;
}

mehdi.mousavi
شنبه 09 شهریور 1392, 19:29 عصر
سلام.
کدتون رو باید به بخش jQuery ارسال می کردید... در هر حال، کدی که نوشته اید واقعا کد خوانایی نیست و باید Refactor بشه.
چند تا نکته رو میگم خدمتتون، حتما درست کنید.



وقتی قراره از $('#'+ id[i]) چند جا استفاده کنید، ابتدا اونو در یک متغیر نگهدارید. سپس از اون متغیر در مابقی تابع استفاده کنید.
در برنامه نویسی چیزی داریم به اسم Separation of Concerns که در اون اجزای برنامه باید از هم جدا باشه. کدی که شما نوشته اید، هم داره عمل Validation رو انجام میده، هم داره دست میبره تو DOM Doc. Style که این درست نیست. باید دو تابع جداگانه داشته باشید، که یکی فقط کار Validation رو انجام بده، و دیگری، CSS Style مناسب رو به اون Input یا Element در حال Validate شدن اضافه کنه. پس دقت کنید، اینجا یه نکته دیگه رو هم خدمتتون عرض کردم. مطلقا Style ها رو بدین شکل و بصورت Inline به Element ها Assign نکنید. جای این کار، از addClass استفاده کنید و فرضا کلاس error رو به اون input تخصیص بدید. بعد در CSS ها، هر کسی هر طور مایل بود می تونه Style فیلدهایی که با خطا مواجه شدن رو تغییر بده.
برای اینکه ببینید فیلد خالی بوده یا خیر، باید مقدار $.trim() رو بگیرید، سپس length اون اگر بیش از صفر بود، بعنی فیلد مقدار داره؛ در غیر اینصورت فیل خالی بوده. در نتیجه، استفاده از حلقه در کد فوق مطلقا کاربردی نداره.
$.trim() تابع هستش، اما فراموش کرده اید که () هاشو بذارید. ضمن اینکه trim مقدار element رو در جا trim نمیکنه، بلکه trim شده ورودی رو بصورت خروجی بهتون برمیگردونه، سپس شما میتونید بر اساس مقدار خروجی تابع مابقی کد رو بنویسید.
جای اینکه همه این کار ها رو انجام بدید که فقط بتونید validation یه textbox رو تکمیل کنید، میتونید از Plugin هایی که برای این منظور نوشته شده استفاده کنید. چند روز پیش به یکی از این پلاگین ها اشاره کردم، لطفا چند پست قبلی منو در بخش jQuery مطالعه کنید...

موفق باشید.

engmmrj
شنبه 09 شهریور 1392, 20:31 عصر
با توجه به صحبت های شما من تابع زیر رو نوشتم ، آیا این تابع با استاندار های که شما بیان کردید جور در می آید ؟
یک سوال دیگر ، ما ID یک element رو داریم نام Tagرو نداریم چطوی از ID یک Element میشه یک کلاس رو حذف کرد ؟

function valid_box(id)
{
count = id.length-1 ;
status = true ;
for( i = 0 ; i <= count ; i++ )
{
$('#'+ id[i] ).trim ;
if( $('#'+ id[i] ).val() == "")
{
$('#'+ id[i] ).css({'border-color':'#F00'});
status = false ;
}
else
$('#'+ id[i] ).css({'border-color':'#CCC'});
}
return status ;
}

function id (id) {
return $('#'+id);
}
function add_error(id) {
return id(id).addClass('alert');
}
function remove_error(id) {
return id(id).removeClass('alert');
}
function valid_box(id) {

var count = ( id.length - 1 );

var status = true ;

for ( var i = 0 ; i <= count ; i++ ) {

var id_trim = $.trim( id ( id[i] ) ) ;
var id_value = id_trim.val() ;

if( id_value == '' || id_value == null) {
add_error( id_trim );
status = false ;
}
else
remove_error( id_trim ) ;
}
return status ;
}

mehdi.mousavi
شنبه 09 شهریور 1392, 21:05 عصر
سلام.
بهتر شد، اما همه نکاتی که گفتم رو اعمال نکردید. کد زیر رو نگاه کنید:

function isValidTextBox($elm) {
return $elm.val().trim().length > 0;
}

function validateTextBox(tbid) {
var $elm = $('#' + tbid);
if(isValidTextBox($elm)) {
$elm.removeClass('error');
}
else {
$elm.addClass('error');
}
}

مطلقا کدی که نوشتم رو در Production Code اتون استفاده نکنید. اینو فقط نوشتم تا بیاد دستتون که چی میگم...
حالا که شروع کردید به Refactor کردن کد (که بسیار عالیه)، در مرحله بعد باید کدی رو که نوشتم رو بصورت
یک jQuery Plugin بنویسید تا بشه اونو روی همه TextBox ها اعمال کرد...

موفق باشید.

engmmrj
شنبه 09 شهریور 1392, 21:25 عصر
کدتون خیلی قشنگه ، نکات قشنگی هم داشت .خیلی ممنون

یک jQuery Plugin بنویسید تا بشه اونو روی همه TextBox ها اعمال کرد...
بلد نیستم .
آیا میشه تابعی نوشت که بدون دادن ایدی Text box ها کل text box هارو چیک کنه ؟

mehdi.mousavi
سه شنبه 12 شهریور 1392, 21:26 عصر
سلام.
حقیقتش خیلی خوشم اومد که صریح و بی پروا گفتید "بلد نیستم". احسنت. این عموما مهم ترین گام برای پیشرفته...

لطفا این مقاله (http://www.ibm.com/developerworks/library/wa-jqueryplugins/) رو بخونید، تا با jQuery Plugin ها آشنا بشید. بعدش سعی کنید خودتون کدی که دادم
رو به نحوی تغییر بدید که بعنوان یک jQuery Plugin دیگران بتونن از کد شما استفاده کنن. (برای Validate کردن Textbox ها).
اگر به هر دلیلی موفق نشدید یا مجددا سوالی در این مورد بود، بفرمایید تا براتون توضیح بدم چیکار باید کنید.


آیا میشه تابعی نوشت که بدون دادن ایدی Text box ها کل text box هارو چیک کنه ؟
البته که شدنیه. فعلا در مرحله اول مقاله ای که دادم خدمتتون رو مطالعه کنید تا به این بخش هم برسیم. :)

موفق باشید.

پ.ن.: من نمیدونم چقدر اطلاعات در مورد JavaScript دارید، اما نوشتن یه Plugin درست و حسابی نیازمند آشنایی با چند تا Pattern در JavaScript هستش.