PDA

View Full Version : سوال: اجرای کد های جاوا اسکریپت تو codebehind؟



ramin_rp
دوشنبه 12 دی 1390, 18:43 عصر
سلام

دوستان تو یه پروژه نیاز دارم که تو جاهی مختلف کدهای جاوا اسکریپت رو اجرا کنم
مثلا:
پس از اتمام یا هنگام اجرای یه تابع تو codebehind
هنگامی که یه event خاصی اتفاق افتاد
و...

آیا این کار امکان پذیره؟ چگونه؟
مقالات زیادی رو توی نت دیدم ولی مشکل حل نشد

baran_mehr
دوشنبه 12 دی 1390, 20:03 عصر
احتمالا با این مقاله مشکلت حل میشه

درحاليكه تمامي كنترلهاي سرور ASP.NET كارايي سمت سرور دارند (Server-Side)، اغلب توانايي يك كنترل ميتواند با تزريق اسكريپت هاي سمت كاربر ارتقا داده شود. بعنوان مثال ميتوان به كنترلهاي اعتبارسنجي (Validation Controls) ، اشاره نمود كه از اسكريپتهاي سمت كاربر به نحو احسن استفاده ميكنند.

دو نوع راهكار براي اضافه كردن اسكريپت هاي سمت كاربر به كنترلهاي سمت سرور ASP.NET وجود دارد :

Client-Side Script Blocks

Client-Side HTML Attributes

نوع اول عموما با JavaScript نوشته مي شوند و معمولا شامل توابعي هستند كه بايد پس از كامپايل صفحه با يك رويداد خاص در سمت كاربر، اجرا شوند. نوع دوم راهي براي ايجاد ارتباط بين يك رخداد سمت كاربر و يك كد اسكريپت سمت كاربر است.

براي فهم بهتر دو روش فوق به مثال ساده زير توجه كنيد :

صفحه HTML زير شامل يك بلوك اسكريپت سمت كاربر ( بنام doClick ) و يك Button مي باشد (كه توسط <input> ساخته شده است) و زمانيكه كاربر روي اين دكمه كليك ميكند، تابع doClick در سمت كاربر اجرا ميشود.


<html>
<body>
<form>
<script language="JavaScript">
<!--
function doClick() {
alert("You clicked me!");
}
// -->
</script>
<input type="button" onclick="doClick()" value="Click Me!" />
</form>
</body>
</html>در كد بالا لازم است تا به موارد زير توجه كنيد :

بلوك اسكريپت در بين تگ هاي توضيحات HTML قرار گرفته است. دليل اين امر اين است كه در مرورگرهاي خيلي قديمي كه قادر به اجراي كدهاي جاوااسكريپت نيستند به جاي اجراي كدها، متن كدها را روي صفحه نمايش مي دهند. براي جلوگيري از اين مورد، كد اسكريپت را بين دو توضيحات قرار داده ايم تا در صورتي كه مرورگر كاربر نتوانست اين كدها را كامپايل كند، متن كدها بصورت توضيحات درنظر گرفته شود و روي صفحه نمايش داده نشود. (ميتوانستيم با دستورات جاوا اسكريپت هم اين موضوع را بررسي كنيم)

تابع جاوا اسكريپت alert يك جعبه گفتگو ( Dialog Box ) را روي صفحه به كاربر نمايش مي دهد.

عناصر HTML اغلب داراي يك سري خصوصيات سمت كاربر هستند مانند : onClick و onMouseOver و ..كه ميتوانند به توابع خاصي assign شوند تا در موقع رخداد اين خصوصيت در سمت كاربر، آن تابع اجرا شود. بعنوان مثال در كد فوق خصوصيت onClick عنصر input به تابع doClick ، اشاره داده شده است. بنابراين با كليك كردن روي اين دكمه بايد تابع doClick اجرا شود و يك Dialog Box را روي صفحه نمايش دهد.

توضيحات : يك ليست از رخدادهاي جاوااسكريپت و خصوصيات HTML را ميتوانيد در مقاله Introduction To Dynamic HTML پيدا كنيد. براي كسب اطلاعات بيشتر در مورد كدهاي سمت كاربر جاوااسكريپت به مقاله HTML and Dynamic HTML مراجعه كنيد.

در ايم مقاله ما هر دو روش استفاده از بلوك هاي اسكريپت سمت كاربر ( Client-Side Script Blocks ) و خصوصيات يك عنصر (HTML Element Attribute ) را در يك سرور كنترل ASP.NET را بررسي مي كنيم.

ابتدا اجازه دهيد تا نگاهي به دو متد از كلاس System.Web.UI.Page بيندازيم :

RegisterStartupScript

RegisterClientScriptBlock

در ادامه ابتدا يك سرور كنترل ساده مي سازيم كه يك Dialog Box سمت كاربر را زماني كه صفحه لود مي شود، به كاربر نمايش دهد. بعد از آن توجه شما را به اضافع كردن خصوصيات HTML به يك عنصر HTML ، در هنگام Render شدن اين كنترل در سمت سرور جلب مي كنم.



اضافه كردن بلوك هاي اسكريپت سمت كاربر توسط متدهاي RegisterStartupScript و RegisterClientScriptBlock

كلاس System.Web.UI.Page شامل دو متد ارزشمند براي اضافه كردن كدهاي اسكريپت سمت كاربر به صفحات ASP.NET كامپايل شده مي باشد كه عبارتند از :

RegisterStartupScript (key, script)

RegisterClientScriptBlock (key, script)

هر دوي اين متدها دو رشته بعنوان ورودي ميگيرند. دومين پارامتر ( script )، شامل كد اسكريپت سمت كاربر موردنظر همراه با تگهاي شروع و پايان اسكريپت مي باشد كه بايد در صفحه اضافه شود. پارامتر اول ( key )، يك كليد منحصربفرد براي اسكريپت موردنظر است.

تفاوت بين اين دو متد در مكاني است كه اسكريپت درج مي شود. متد RegisterClientScriptBlock اسكريپت موردنظر خود را در ابتداي صفحه درست پس از تگ <form runat=server> قرار ميدهد. در حاليكه متد RegisterStartupScript ، اسكريپت موردنظر خود را در انتهاي صفحه، درست قبل از تگ <form/> قرار ميدهد.

براي فهم علت اختلاف دو متد بالا و كاربرد هر يك، به مثال زير توجه كنيد :

كد شماره يك :


1 : <input type="text" id="myTextBox" />
2 : <script language="JavaScript">
3 : <!--
4 : document.getElementById("myTextBox").focus();
5 : // -->
6 : </script>


كد شماره دو :


7 : <script language="JavaScript">
8 : <!--
9 : document.getElementById("myTextBox").focus();
10 : // -->
11 : </script>
12 : <input type="text" id="myTextBox" />هدف هردوي اين كدها اين است كه Focus صفحه را روي عنصر myTextBox ببرند، ولي تنها كد شماره يك درست كار ميكند و كد شماره دو كار نمي كند. علت اين است كه چون كد صفحه خط به خط تفسير مي شود لذا زماني كه مفسر ( Interpreter ) به خط شماره 9 ميرسد، هنوز عنصر HTML اي بنام myTextBox وجود ندارد، بنابراين خصوصيتي هم براي آن ست نخواهد شد. در حاليكه در كد اول مشكلي وجود ندارد.

بنابراين در مواردي كه كد اسكريپت موردنظر ما براي Page_Load طراحي شده باشد، بايد توسط متد RegisterStartupScript به كد HTML صفحه اضافه شود تا در انتهاي كدهاي صفحه قرار بگيرد (تا مطمئن باشيم كه تمامي عناصر HTML صفحه، ايجاد شده اند). ولي در مواردي كه اسكريپت موردنظر ما براي رويداد خاصي در سمت كاربر (مانند كليك كردن يك دكمه) طراحي شده است، بايد از متد RegisterClientScriptBlock استفاده شود، تا اسكريپت در ابتداي صفحه HTML درج شود. مانند اولين مثالي كه در ابتداي همين مقاله مشاهده كرديد. (اسكريپت مربوط به تابع doClick ، در ابتداي صفحه و قبل از تمامي عناصر HTML درج شده است)

متد RegisterStartupScript ، اسكريپت موردنظر خود را در انتهاي صفحه درج مي كند و در اسكريپت هايي كه براي Page_Load طراحي شده اند مناسب است. در حاليكه متد RegisterClientScriptBlock اسكريپت موردنظر خود را در ابتداي صفحه درج مي كند و براي اسكريپت هايي مناسب است كه براي رخدادهاي سمت كاربر، طراحي شده اند.

در ادامه بحث و در قسمت دوم اين مقاله، با استفاده از متدهاي RegisterStartupScript و RegisterClientScriptBlock دو سرور كنترلي كه در ابتداي همين مقاله وعده داده شد، را طراحي خواهيم نمود.
برگرفته از سایت www.nofa.ir

ramin_rp
سه شنبه 13 دی 1390, 11:35 صبح
سلام
ممنون دوست من
ولی من هنوز جواب سوالم رو نگرفتم

فرض کنید این کد جاوا اسکریپت من هست

<script type="text/javascript">
function alertMe() {
alert('Hello ');
}
</script>
این کد تو قسمت head صفحه aspx من هست
من میخوام این کدرو زمانی اجرا کنم که یه تابع تو codebehind اجرا شود
مثلا در رویداد click یه asp:Button اگر یک شرط برقرار بود کد جاوا اسکریپت اجرا بشه؟

سلام دوستان
من اسکریپت رو به شکل زیر رجیستر کردم
protected void Page_Load(object sender, EventArgs e)
{
if (!ClientScript.IsStartupScriptRegistered("alert"))
{
Page.ClientScript.RegisterStartupScript(this.GetTy pe(),"alert", "alertMe();", true);

}
}


حالا چطوری این اسکریپت رو از تابعی فراخوانی کنم؟

محمد متاله
چهارشنبه 14 دی 1390, 11:47 صبح
با سلام
به روش زیر می توانید کنترل asp را به صفحه اضافه کنید و در یک if نگاه کنید اگر شرطتتان برقرار بود به Attribute های آن کنترل توابع جاوا اسکریپت نسبت دهید
توجه کنید که در صورت نیاز به تغییر خصوصیت های آن کنترا شامل رنگ متن و یا رنگ background آن کنترل می بایست در هنگام فراخوانی تابع مقدار this را هم که یک کلاس object شامل تمامی خصوصیت های آن کنترل هست را به آن پاس دهید تا بتوانید در تابع جاوا اسکریپت به آن خصوصیات مربوط به همین کنترلی که این تابع را Raise کرده دسترسی داشته باشید

protected void Page_Load(object sender, EventArgs e)
{
Button btn = new Button();
btn.Text = "Test";
PlaceHolder1.Controls.Add(btn);

if (true)
{
btn.Attributes.Add("onclick", "javascript:myalert(this)");
}
}

ramin_rp
چهارشنبه 14 دی 1390, 12:26 عصر
مسئله اینه که من تو Page_Load نمیدونم که شرط برقرار هست یانه
همچنین من نیاز دارم تابعی که خودم نوشتم هر وقت اجرا شد کد جاوا اسکریپت رو اجرا کنه

Alfred188
چهارشنبه 14 دی 1390, 15:58 عصر
مسئله اینه که من تو Page_Load نمیدونم که شرط برقرار هست یانه
همچنین من نیاز دارم تابعی که خودم نوشتم هر وقت اجرا شد کد جاوا اسکریپت رو اجرا کنه

خوب چرا نمی دونید!

Page.ClientScript.RegisterStartupScript(

this.GetType(),"alert", "alertMe();", true);

هر جا که لازم داشتید از این کد استفاده کنید! هر جا که شرط برقرار بود! به جای alertMe() اسم function خودتون رو بنویسید!
اگه هم از اسکریپت منیجر استفاده می کنید می تونید از این استفاده کنید



ScriptManager.RegisterStartupScript(this, this.GetType(), "ajax", "alertMe();", false);

ramin_rp
پنج شنبه 15 دی 1390, 10:56 صبح
سلام
بله کاملا درسته
مشکل این بود که من فکر میکردم با دستور بالا باید اول هنگام لود صفحه اسکریپت رو رجیستر کنم و بعد هنگام نیاز اسکریپت رجیستر شده رو فراخوانی کنم
از راهنمایی دوستان متشکرم