PDA

View Full Version : سوال: جایگزین برای کنترل Ajax Update Panel



mortezagt
شنبه 07 تیر 1393, 14:29 عصر
سلام دوستان
راستش من یه مشکل اساسی با آپدیت پنل آجاکس دارم .
وقتی که صفحه پست بک میشه، دیگه کدهای جاوااسکریپت غیر فعال میشن .
البته با کد زیر میشه کدها رو فعال کرد ولی نمیشه باهاش مثلا تایمر معکوس که خیلی فانشن داره رو بعد از بست پک فعال کرد .
Sys.WebForms.PageRequestManager.getInstance(init);

کسی هست که بدونه از طریق کدی شبیه کد بالا بشه یک فایل جاوااسکریپت رو بصورت کامل بعد از پست بک مجدد فعال کنه ؟
مثلا کد با رو در نظر بگیرید:
" init " اسم یک فانشن جاوا اسکریپته .
بجای اینکه بخوایم یکی یکی اسم تمام فانشن ها رو وارد کنیم، بیایم اسم فایل جاوا اسکریپتی که اون فانشن ها توش هستن رو بنویسیم تا کل فانشن های اون فایل رو بعد از بست بک مجددا فعال کنه
یا اینکه یه کنترل دیگه که شبیه به کنترل آپدیت پنل باشه رو بهم معرفی کنه که با جاوا اسکریپت دعوا نداشته باشه ؟
البته توی سایت خود آجاکس نوشته بودن در ورژن جدیدشون که سپتامبر 2013 اماده میشه، کاملا با کدهای جاوا اسکریپت همخوانی دارن.

اساتید گرامی خواهشا یه کمکی به ما کنید.
با تشکر
البته من خیلی سرچ کردماااااا

parvizwpf
شنبه 07 تیر 1393, 16:01 عصر
شما میتونید مبحث ASP.NET Ajax رو در وب سرچ کنید و روشهای مختلف رو مطالعه کنید.

mortezagt
شنبه 07 تیر 1393, 17:52 عصر
شما میتونید مبحث ASP.NET Ajax رو در وب سرچ کنید و روشهای مختلف رو مطالعه کنید.

تا دلت بخواد سرچ کردم
البته الان دارم به یه جاهای خوبی میرسم ولی باز هم اگر دوستان تجربه این مشکل رو داشتن و موفق به حلش شدن لطفا راهنمایی کنن

ahmad156
شنبه 07 تیر 1393, 18:15 عصر
سلام دوست عزیز
شما وقتی از UpdatePanel استفاده میکنین در واقع AsyncPostBack رخ میده و قسمتی از صفحه که درون UpdatePanel قرار داره Update میشه پس وقتی این قسمت Update میشه تمام توابع JavaScript که قبلاً بوده و به کنترل ها Bind شده بوده دیگه کار نخواهد کرد.پس شما چند راه دارین که یکی از اونها روش شماست که مناسب نیست.شما دو تا راه بهتره دارین
1-یکی استفاده از تابع live که هر موقع شما کنترل تون تغییر کنه سریعاً عمل Bind رو انجام میده.این تابع بیشتر در Script هایی که کنترل داینامیک تولید میکنن استفاده میشه
2-استفاده از تابع pageLoad به جای document.ready هست.تابع اولی در تمام AsyncPostBack و sysnchronous ها (همون postback) خودمون صدا زده میشه ولی تابع دومی فقط زمان PostBack صدا زده میشه

mortezagt
شنبه 07 تیر 1393, 18:56 عصر
استاد میشه یه نمونه کوچولو برام بسازی ؟
اینطوری بهتر توی مخم فرو میره
البته بگم که مطمعنا راه حل های شما کاملا درسته

dehqhani
شنبه 07 تیر 1393, 19:10 عصر
اگه کسی راح حل دقیقش رو پیدا کرد ما رو بی خبر نزاره

ahmad156
شنبه 07 تیر 1393, 19:11 عصر
کدهای JQuery رو معمولا توی document.ready قرار میدن(علتش رو جستجو کنین متوجه میشین) حالا شما به جای اینکه کدهاتون رو توی document.ready بزارین اون رو توی pageLoad میذارین.
مثالش با live رو مورد Click رو در نظر بگیرین.شما معمولاً برای اجرای دستوری هنگام کلیک یه دکمه به صورت زیر عمل میکنین
$( "#btnSubmit" ).click(function() {
alert("Clicked");

});



حالا شما به جای استفاده از این روش به صورت زیر عمل کنین

$( "#btnSubmit" ).live( "click", function() {


alert("Clicked");


});

mortezagt
شنبه 07 تیر 1393, 19:28 عصر
ببینید من یک یوزر کنترل دارم که به صورت داینامیک به فرمم اذافه میکنم
توی یوزر کنترلم یه تایمر معکوس با استفاده از جاوا هستش
مشکل من اینه که ددقیقا نمیدونم برای live کردن فانشن ها کجای این کد رو تغییر بدم

این کد منه
شما یه نگاه بنداز ببین چکار باید کرد

<script type=""text/javascript"">
/*
Author: Robert Hashemian (http://www.hashemian.com/)
Modified by: Munsifali Rashid (http://www.munit.co.uk/)
Modified by: Sam Walker (http://blog.bluesam.com)
*/

function countdown(obj)
{
this.obj = obj;
this.Div = ""clock"";
this.TotalSeconds = 1000;
this.DaysDisplayFormat = ""%%D%% روز,"";
this.HoursDisplayFormat = ""%%H%% ساعت,"";
this.MinutesDisplayFormat = ""%%M%% دقیقه,""
this.SecondsDisplayFormat = ""%%S%% ثانیه"";
this.CountActive = true;

this.DisplayStr;

this.Calcage = cd_Calcage;
this.CountBack = cd_CountBack;
this.Setup = cd_Setup;
}

function cd_Calcage(seconds, num1, num2)
{
s = ((Math.floor(seconds/num1))%num2).toString();
return (s);
}
function removeSIfOne(number, str)
{
if(number == 1)
{
return str.substring(0,str.lastIndexOf('s')) + str.substring(str.lastIndexOf('s') + 1);
}
else
{
return str;
}
}
function cd_CountBack(secs)
{
if(secs < 1)
{
this.CountActive = false;
}
var days = this.Calcage(secs,86400,100000);
var hours = this.Calcage(secs,3600,24);
var minutes = this.Calcage(secs,60,60);
var seconds = this.Calcage(secs,1,60);

this.DisplayStr = """";
var first = true;
if(days > 0)
{
first = false;
this.DisplayStr += this.DaysDisplayFormat.replace(/%%D%%/g,days);
this.DisplayStr = removeSIfOne(days, this.DisplayStr);
}
if(hours > 0 || days > 0)
{
if(!first)
{
this.DisplayStr += "" "";
}
first = false;
this.DisplayStr += this.HoursDisplayFormat.replace(/%%H%%/g,hours);
this.DisplayStr = removeSIfOne(hours, this.DisplayStr);
}
if(minutes > 0 || hours > 0 || days > 0)
{
if(!first)
{
this.DisplayStr += "" "";
}
first = false;
this.DisplayStr += this.MinutesDisplayFormat.replace(/%%M%%/g,minutes);
this.DisplayStr = removeSIfOne(minutes, this.DisplayStr);
}
if(!first)
{
this.DisplayStr += "" "";
}
this.DisplayStr += this.SecondsDisplayFormat.replace(/%%S%%/g,seconds);
this.DisplayStr = removeSIfOne(seconds, this.DisplayStr);

document.getElementById(this.Div).innerHTML = this.DisplayStr;
if (this.CountActive) setTimeout(this.obj +"".CountBack("" + (secs-1) + "")"", 990);
}
function cd_Setup()
{
this.CountBack(this.TotalSeconds);
}
</script>

ahmad156
شنبه 07 تیر 1393, 20:15 عصر
اگر مشکل شما فقط زمانی که از UpdatePanel استفاده میکنید هست و بدون UpdatePanel مشکل نداشته باشه تمام توابع بالا رو توی تابع pageLoad قرار بدین باید کار کنه

mortezagt
شنبه 07 تیر 1393, 20:21 عصر
اگر مشکل شما فقط زمانی که از UpdatePanel استفاده میکنید هست و بدون UpdatePanel مشکل نداشته باشه تمام توابع بالا رو توی تابع pageLoad قرار بدین باید کار کنه

این کار رو کردم ولی جواب نداد :گریه:
heeeeeeeelp

dehqhani
یک شنبه 08 تیر 1393, 07:42 صبح
یکی یه راه حل جامع تری بگه

ممنون میشیم اگه نمونه مثال هم بزارید که مطلب رو کامل بگیریم

mortezagt
یک شنبه 08 تیر 1393, 09:37 صبح
خدایی چرا باید آجاکس با جی کوئری توی جنگ باشن :گریه:

یکی بهم help کنه :گریه::گریه::گریه::گریه:

mortezagt
دوشنبه 09 تیر 1393, 10:15 صبح
HEEEEEEEEEEEEEEEEEELPPPPPP