PDA

View Full Version : مشکل استفاده از javascript در ASP.NET



m.hamidreza
چهارشنبه 14 شهریور 1386, 17:44 عصر
من یه صفحه ی aspx دارم که در یه td از این صفحه دوتا textbox (از کنترل های HTML) گذاشتم تو یکی از این textbox ها کاربر میتونه یه متنی رو تایپ کنه و textbox دیگه در نقش یه شمارنده عمل میکنه و تعداد کاراکتر های تایپ شده کاربر رو میشماره که مثلا از 100 شروع میکنه و بازای هر کاراکتر که کاربر تایپ میکنه یکی از 100 کم میشه تا برسه به 0 . این تابع رو با کمک دوستان با javascript نوشتم ؛
بعد مشکل این شد که چون این td درون تگ form تو اون صفحه ی aspx قرار داشت تابع javascript به این textbox ها دسترسی نداشت و error می داد ،اون td رو تو یه صفحه ی html دیگه گذاشتم و به iframe توی aspx ست کردم ! درست شد ولی من میخوام value ی اون textbox رو هم تو db ذخیره کنم که الان تو codebehind بهش دسترسی ندارم !
البته runat="server" هم هستن textbox ها . . .

ممنون .

jasadeghi
چهارشنبه 14 شهریور 1386, 18:14 عصر
دروود


بعد مشکل این شد که چون این td درون تگ form تو اون صفحه ی aspx قرار داشت تابع javascript به این textbox ها دسترسی نداشت


شما احتمالا از مستر پیج داری استفاده می کنی.در این صورت اگر Source صفحه رو در هنگام اجرای برنامه در Browser نگاه کنی می بینی که به textbox های شما id به این شکل داده "ctl00_ContentPlaceHolder1_TxtTitle" همونطور که متوجه شدی TxtTitle آیدی منه و ctl00_ContentPlaceHolder1_ رو کمپایلر به ایدی من اضافه کرده. حالا کافیه شما در برنامه javascript ایدی کامل رو اضافه کنی تا دسترسی به textbox در form برات میسر بشه.

پیروز باشید

m.hamidreza
چهارشنبه 14 شهریور 1386, 18:58 عصر
ممنون نکته خوبی بود، ولی تو این صفحه masterpage ندارم . . .
کد javascript اینه :




<scripttype="text/javascript">
var max=500;
document.getElementById("counter");
counter.value=max;
function check_max_char(obj){
str=obj.value;
len=str.length;
if(len>max){
str=str.substr(0,max);
alert("OverFlow");
obj.value=str;
}
document.getElementById("counter");
counter.value=max-obj.value.length;
}
</script>
<tablestyle="width: 100%"cellspacing="0"cellpadding="0">
<tr>
<tdstyle="width:120px; height: 24px;"class="style9">Size :</td>
<tdstyle="width: 40px; height: 24px;"align="right">
<inputid="counter"value="500"style="width: 30px"runat="server"type="text"/></td>
<tdclass="style9"style="height: 24px">chars</td>
<td>
&nbsp;<textareaid="textarea1"onkeyup="check_max_char(this);"runat="server"style="width: 283px; height: 145px"></textarea></td>
</tr>
</table>



اگه امتحان کنی وقتی textbox ها تو یه تگ فرم باشه نمیشه بهش دسترسی داشت ...

jasadeghi
پنج شنبه 15 شهریور 1386, 09:37 صبح
دروود به شما

این کد رو هم می تونی به این منظور استفاده کنی




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>maxchars</title>
<script type="text/javascript" src="maxchars.js"></script>
<link type="text/css" rel="stylesheet" href="maxchars.css">
<script type="text/javascript">
var maxChars = {
// cross-browser event handling for IE5+, NS6 and Mozilla
// By Scott Andrew
addEvent: function(elm, evType, fn, useCapture) {
if(elm.addEventListener) {
elm.addEventListener(evType, fn, useCapture);
return true;
} else if(elm.attachEvent) {
var r = elm.attachEvent('on' + evType, fn);
return r;
} else {
elm['on' + evType] = fn;
}
},
attVal: function(element, attName) {
return parseInt(element.getAttribute(attName));
},
init: function() {
if(!document.getElementsByTagName || !document.getElementById) {
return;
}

maxChars.form = document.getElementById('myform');
maxChars.textarea = document.getElementById('message');
maxChars.maxlength = maxChars.attVal(maxChars.textarea, 'maxlength');
maxChars.limit_span = document.getElementById('limiter');
maxChars.limit_span.innerHTML = '<strong>' + maxChars.maxlength + '</strong>'
+ ' characters remaining.';

maxChars.addEvent(maxChars.textarea, 'keyup', maxChars.countlimit, false);
},
countlimit: function(e) {
var placeholder;
var lengthleft = maxChars.maxlength - maxChars.textarea.value.length;
if(e && e.target) {
placeholder = e.target;
}
if(window.event && window.event.srcElement) {
placeholder = window.event.srcElement;
}
if(!placeholder) {
return;
} else if(lengthleft < 0) {
maxChars.textarea.value = maxChars.textarea.value
.substring(0, maxChars.maxlength);
} else if(lengthleft > 1) {
maxChars.limit_span.innerHTML = '<strong>' + lengthleft + '</strong>'
+ ' characters remaining.';
} else {
maxChars.limit_span.innerHTML = '<strong>' + lengthleft + '</strong>'
+ ' character remaining.';
}
}
}
maxChars.addEvent(window, 'load', maxChars.init, false);
</script>
</head>
<body>
<div id="wrapper">
<form name="form1" method="post" action="forDel.aspx" id="form1">
<p><label for="name">Name</label>
<input type="text" name="name" id="name"></p>
<p><label for="email">Email</label>
<input type="text" name="email" id="email"></p>
<p><label for="msg">Message</label>
<textarea name="message" id="message" cols="50"
rows="8" maxlength="50"></textarea>
<span id="limiter"></span></p>
</form>
</div>
</body>
</html>



با آرزوی بهروزی

m.hamidreza
پنج شنبه 15 شهریور 1386, 10:10 صبح
آقا دستت درد نکنه چه کد عجیبی هم هست ! :متفکر::لبخندساده:
نقش خصوصیت action تو تگ form چیه ؟

من منظورم رو تونستم برسونم ؟

jasadeghi
پنج شنبه 15 شهریور 1386, 10:51 صبح
اکشن رو در زمانی استفاده می کنیم که می خوایم فرم رو به یک صفحه خاص ارسال کنیم . شما می تونی action="forDel.aspx" رو از برنامه حذف کنید

medi33
جمعه 16 شهریور 1386, 20:57 عصر
شما احتمالا از مستر پیج داری استفاده می کنی.در این صورت اگر Source صفحه رو در هنگام اجرای برنامه در Browser نگاه کنی می بینی که به textbox های شما id به این شکل داده "ctl00_ContentPlaceHolder1_TxtTitle" همونطور که متوجه شدی TxtTitle آیدی منه و ctl00_ContentPlaceHolder1_ رو کمپایلر به ایدی من اضافه کرده. حالا کافیه شما در برنامه javascript ایدی کامل رو اضافه کنی تا دسترسی به textbox در form برات میسر بشه.



سلام

این id همه جا معتبر نیست و ممکنه در مسترپیج های مختلف یا در سرور های مختلف طور دیگه ای تفسیر بشه

جایی که می خوان در جاوا اسکریپ به کنترلی دسترسی داشته باشن از document.getElementById استفاده می کنن. اولا بجای استفاده از این دستور می تونی از get$ استفاده کنی که شیکتره

برای اینکه بتونی در صفحه ای که از master استفاده می کنه و یا در کلیه صفحات به کنترلها دسترسی داشته باشی و مطمئن باشی از اینکه این کنترل توسط javascript شناخته میشه از این دستور استفاده کن:
برای مثال من کنترل textBox1 رو دارم ... می خوام از javascript بهش دسترسی داشته باشم (فرقی نمی کنه کنترل کجای صفحه باشه)

get(<%=TextBox1.ClientID %> xxxxxxxxxxx$

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

موفق باشید!!

m.hamidreza
جمعه 16 شهریور 1386, 23:45 عصر
ممنون از جوابتون ...
بحث ولی یه ذره منحرف شد ، سوال رو اینجوری بگم الان مشکل کد زیر چیه :



<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="js.aspx.cs"Inherits="js" %>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>JavaScript Test</title>
<scripttype="text/javascript">
var max=20;
document.getElementById("txt_counter");
txt_counter.value=max;
function check_max_char(obj){
str=obj.value;
len=str.length;
if(len>max){
str=str.substr(0,max);
alert("OverFlow");
obj.value=str;
}
document.getElementById("txt_counter");
txt_counter.value=max-obj.value.length;
}

</script>
</head>
<body>
<formid="form1"runat="server">
<asp:TextBoxID="txt_counter"runat="server"></asp:TextBox>
<asp:TextBoxID="txt_area"runat="server"Height="88px"TextMode="MultiLine"></asp:TextBox>
</form>
</body>
</html>




و در CodeBehind هم :



protectedvoid Page_Load(object sender, EventArgs e)
{
txt_area.Attributes.Add("onkeyup", "check_max_char(this)");
}



الان این خطا رو میده :


'txt_counter' is indefined


script جاوااسکریپت در حالتی که از کنترل های html ای استفاده کنم کار میکنه ...

medi33
یک شنبه 18 شهریور 1386, 20:04 عصر
سلام
مشکل کد اینه که قبل ساخته شدن کنترلهای asp جاوا اسکریپت می خواد بهشون دسترسی داشته باشه
اون قسمتی که بیرون از function بود رو اگه داخل یک کلید html بزاری مشکل حل میشه

اما روشی که من پیشنهاد می کنم اینه که از #C جاوا اسکریپت رو run کنی
کدشو آپلود کردم
تمام کدهای جاوا اسکریپت رو از source پروژه پاک کن و در pageLoad بنویس
موفق باشی!

m.hamidreza
دوشنبه 19 شهریور 1386, 15:15 عصر
ممنون ... :خجالت:
کنترل ها تو کدوم event ساخته میشن ؟ تو Page_Init ؟
یعنی اسکریپت javascript قبل از اون event اجرا میشن !
من کاری که شما گفتی رو انجام دادم :


protectedvoid Page_Load(object sender, EventArgs e)
{
String callbackScript = "var max=20; var counter=document.getElementById('" + txt_counter.ClientID + "');";
callbackScript += "counter.value=max;";
callbackScript += "function check_max_char(obj){";
callbackScript += "str=obj.value;";
callbackScript += "len=str.length;";
callbackScript += "if(len>max){";
callbackScript += "str=str.substr(0,max);";
callbackScript += "alert('OverFlow');";
callbackScript += "obj.value=str;";
callbackScript += "}";
callbackScript += "document.getElementById('" + txt_counter.ClientID + "');";
callbackScript += "txt_counter.value=max-obj.value.length;";
callbackScript += "}";
ClientScript.RegisterStartupScript(this.GetType(), "ReceiveServerData", callbackScript, true);

txt_area.Attributes.Add("onkeyup", "check_max_char(this)");
}


از تو source هم پاک کردم ولی بازم همون error رو میده !:ناراحت:
این پارامتر دوم RegisterStartupScript چیکار میکنه ؟

medi33
سه شنبه 20 شهریور 1386, 20:47 عصر
RegisterStartupScript یک متد از کلاس ClientScript یا ClientScriptManager هست
که با کمک این متدها میشه کدهای جاوا اسکریپت رو سمت #C اجرا کرد
اطلاعات بیشتر رو می تونید از این آدرس بگیرید:
http://msdn2.microsoft.com/en-us/library/3hc29e2a.aspx
http://dotnetslackers.com/articles/aspnet/JavaScript_with_ASP_NET_2_0_Pages_Part1.aspx
ولی اون کد رو من تست کردم مشکلی نداشت
نمی دونم !!

mahdi_farhani
چهارشنبه 21 شهریور 1386, 04:21 صبح
همونطور که دوستمون اشاره کردن شما از این کد استفاده کن

document.getElementById('<%txt_counter.ClientId%>'");
و یا یه بار برنامه اجرا کن و تو Browser سورس برنامه رو ببین و کدهای ایجاد شده رو نگاه کن و سعی کن Textbox مورد نظر خودتو پیدا کنی این تگ به تگ HTML تبدیل شده و یه Id داره اون Id رو داخل تابع Get بزار .