PDA

View Full Version : سوال: استفاده از jQuery به همراه کد های JavaScript



aminghaderi
یک شنبه 18 تیر 1391, 08:01 صبح
با سلام خدمت دوستان .
کلاسی با JavaScript نوشتم که درون اون از کد های jQuery استفاده کردم .
کلاس به خوبی کار می کنه ولی اگر قرار باشه تمیز تر ور خواناتر بنویسم ، کار نمی کند؟!
مشکلش هم این هست که کد های جی کوئری دیر لود می شود و متغیر های جاوااسکریپتی کلاس ، مقدار null می گیرند و اصلاحا undefined نمایش داده می شود و باعث Stop اسکریپت می شود!
این نمونه از کلاس فعلی من هست :(حالتی که بدون خطا کار می کند)

var MyClass = new function() {
var StrVariable = "";
var IntVariable = 0;

this.A = function AA() { }

this.B = function BB() {
jQuery(function() {
$.ajax({
type: "POST",
url: "A.ashx/GET",
data: "{ID:'1'}",
contentType: "application/json",
dataType: "json",
success: function(msg) {
alert(msg);

//
//ادامه این متد رو فقط می تونم اینجا بنویسم
//تا مفسر خطا ندهد
//

},
error: function() { alert("در سرور خطایی رخ داده است!"); }
});
});


}
}


//Use...
MyClass.B();

این هم نظمی هست که مد نظرم هست ولی خطا می گیرد :

var MyClass = new function() {
var StrVariable = "";
var IntVariable = 0;

this.A = function AA() { }

this.B = function BB() {
jQuery(function() {
$.ajax({
type: "POST",
url: "A.ashx/GET",
data: "{ID:'1'}",
contentType: "application/json",
dataType: "json",
success: function(msg) {
alert(msg);
StrVariable = msg;
},
error: function() { alert("در سرور خطایی رخ داده است!"); }
});
});

//
//می خوام بتونم ادامه متد رو اینجا بنویسم
//که با خطا مواجه میشم.
//
}
}


//Use...
MyClass.B();

ایراد این کد :
همون اول کد های جاوااسکریپت اجرا می شه و وقتی به کد جی کوئری می رسه ، چون فایل هنوز بار نشده ، از اون رد می شه و به این ترتیب متغیر StrVariable بی مقدار می ماند و در ادامه فرایند کلاس که اینجا قرار نداردم ، دچار مشکل می شود و کل اسکریپت Stop مشود.

لطفا راهنمایی بفرمایید ، چطوری کاری کنم که ، کل کلاس مجبور باشه ، صبر کنه تا فایل jQuery لود بشود و بعد اجرا بشه؟؟؟

plague
یک شنبه 18 تیر 1391, 11:06 صبح
مشکل از جی کوئری و لود شدنش نیست این بخاطر non-blocking بودن جاوا اسکریپته که معمولا یه مزیت محسوب میشه !
اگه توی خوده تابع جی کوئری میخاستی بقیه کد رو بنویسی راه های استانداردی برای این وجود داره ولی شما ظاهرا میخای کلا بیرون از اون تابع باشه
من توی کار با جاوا اسکریپت خیلی مبتدی هستم و از روز اول با جی کوئری کارمو راه انداختم و مطمئن نیستم که اینو میتونین پیاده کنید یا نه ولی یه راه ساده در این مواقع استفاده از یه فلگ داخلی هست و فراخانی تابع از درون خودشه
نمیدونم میتونید توی این کلاستون اینو پیاده سازی کار کنید یا نه من شی گرا کار نکردم با js ولی این نمونه کاریه که میتونید انجام بدید



var status = 0 ;
function BB() {

if(Status == 0 )
{
jQuery(function() {
$.ajax({
type: "POST",
url: "A.ashx/GET",
data: "{ID:'1'}",
contentType: "application/json",
dataType: "json",
success: function(msg) {
alert(msg);
StrVariable = msg;
status = 1;
BB();
return;
},
error: function() { alert("در سرور خطايي رخ داده است!"); }
});
});
}
if(status != 0 )
{
//
//مي خوام بتونم ادامه متد رو اينجا بنويسم
//که با خطا مواجه ميشم.
//
}
}
}

aminghaderi
یک شنبه 18 تیر 1391, 13:19 عصر
ممنون ، ولی این که شد یه تابع بازگشتی؟!
مادام خودش رو فراخونی می کند ، تازه فکر کنم Loop هم شده باشه !!
نه این مد نظرم نیست؟!
همون روش jQuery که فرمودید هم بگید ببینم به کارم نمی یاد.
چون من فقط می خوام تابع رو تا لود jQuery نگهدارم و بعد اجراش کنم ، یه Delay منطقی می خوام.
کلاس JavaScript یا jQuery فرقی نداره ، مهم همون موردی که خودتون فرمودید هست ، دنبال یه روش استاندارد و بهینه هستم.

plague
یک شنبه 18 تیر 1391, 13:58 عصر
خیر این تابع مدام خودش رو فراخانی نمیکنه !
باره اول مقدار فلگ 0 هست پس فقط قسمت جی کوئری رو اجرا میکنه و بقیش اجرا نمیشه
بعد از دل جی کوئری وقتی جواب اومد فلگ رو 1 میکنه و دوباره تابع خودش رو فراخانی میکنه
اینبار فلگ 1 هست و قسمت جی کوئری اجرا نمیشه بلکه قسمت دوم اجرا میشه

شما به چه دلیل میگید که مادام خودش رو فراخانی میکنه ؟

جی کوئری یه متد done داه که ببعد از درخواست ایجکس قرار میگیره و پس از پایان اون و دریافت جواب قطعه کد مورد نظر رو اجرا میکنه

aminghaderi
یک شنبه 18 تیر 1391, 19:15 عصر
الان خود این پلاگن های جی کوئری رو مگر چطور می نویستند که حتمی باید ابتدا فایل jquery دانلود بشه ، بعد هر گونه فعایتی صورت بگیره؟؟
من دنبال این مورد هستم .

plague
یک شنبه 18 تیر 1391, 20:29 عصر
من متوجه منظور شما نمیشم یعنی چی دانلود بشه ؟ اگه منظورت همون ضمیمه کردن سورس خارجی توی صفحه هستش که
لینک ضمیمه رو بالای کد ها بزار وقتی لینک ضمیمه کامل بارگزاری شد کد ها اجرا میشن از روی لینک که نمیپره

این کدی که شما گزاشتی درخواست ایجکس هستش ربطی به دانلود شدن و پلاگین نداره آخه

عذر میخام شاید من روی دانش شما یکم زیاد تر از اونچیزی که باید حساب کردم و توضیح دادم

شما متوجه هستید که این کدی گزاشتید و مشکلش هیچ ربطی به دانلود شدن جی کوئری و نبود توابعش نداره ؟
شما دارید یه درخواست ایجکس میفرستی توی تابعتون منتها تابع شما منتظر برگشت نتیجه درخواست ایجکس (msgدر اینجا ) نمیمونه و نتیجه برگشتی رو به یه تابع داخلی ارجا میده ( یعنی وقتی جواب ایجکس برگشت بره پیش اون تابع و اونجا بهش میگن چیکار کنه ) و خلاصه کد رو ادامه میده و میخاید از نتیجه برگشتی ایجکس استفاده کنید ولی اون پاسخ هنوز نرسیده و تو راهه

aminghaderi
دوشنبه 19 تیر 1391, 08:28 صبح
سلام ، ممنون بابت راهنماییتون.
دانش من در jQuery به 0 میل می کنه ولی javascript و ajax درست تصور کردید ، من به این دو تقریبا کامل مسلط هستم.
ولی با سوتی که من دادم ، حق داردید بگید هیچی از جاوااسکریپت سر در نمی یاره...:لبخند:
اره من دیروز اصلا اون متغیر status رو در کد های شما ندیدم و برای اون گفتم تابع loop شده (شاید بخاطر کم خوابی بوده باشه) امروز کد مجدد داشتم بررسی می کردم ، متوجه شدم.
کدی که زحمت کشیدید و قرار داید واقعا عالی و حساب شده است ، تستش می کنم ، خبرش رو می دم.
واقعا ممنون.

plague
دوشنبه 19 تیر 1391, 10:14 صبح
خواهش میکنم فقط متوجه باشید که مقادیری که ایجکس در اولین فراخانی تابع براتون میفرسته رو در داخل یه متغیر سراسری ذخیره کنید که بار دومی که تابع فراخانی میشه اونها قابل استفاده باشن