PDA

View Full Version : فراخوانی رویداد کلیک باتون در کد جاوا اسکریپت



mahan206
دوشنبه 08 آبان 1396, 17:52 عصر
با سلام
یه کد دارم به صورت زیر
<script>
//زمان مورد نظر به ثانیه
var time = 10;
var sec, min;

//انتخاب المنت مورد نظ
var Showtimer = document.getElementById('timer');
Showtimer.style.color = 'green';
Showtimer.style.fontSize = '18pt';
Showtimer.style.textAlign = 'ltr';
Showtimer.style.font.bold;
//اجرای دستورات هر یک ثانیه یکبار
MyStop = setInterval(timer, 1000);
function onload() {

}
/**
*کم کردن از زمان کل و بدست آوردن ثانیه و دقیقه
*/
function timer() {
time--;
min = Math.floor(time / 60);
sec = time - (min * 60);

if (min <= 9) min = '0' + min;
if (sec <= 9) sec = '0' + sec;

Showtimer.innerHTML = min + ' : ' + sec;
if (min == '00' & sec == '00') {
Showtimer.innerHTML = '00 : 00';
Showtimer.style.color = 'red';
clearInterval(MyStop);
// alert("زمان تمام شد");
document.getElementById('Button1').onserverclick() ;
}
}
</script>


و کد باتون به صورت زیره

<asp:Button ID="Button1" CssClass="btn btn-shadow btn-success" runat="server" Text="ثبت آزمون" onclick="Button1_Click" onserverclick="Button1_Click" />
حالا من میخوام وقتی زمان صفر شد این کد اجرا بشه که در show.aspx.cs نوشته شده
protected void Button1_Click(object sender, EventArgs e)
{
string query = null;
int f2 = int.Parse(Request.QueryString["id"].ToString());
SqlConnection connectchek2 = new SqlConnection(ConfigurationManager.ConnectionStrin gs["ConectSchool"].ToString());
SqlCommand cmdchek2 = new SqlCommand("SELECT * from AzmonFild where azmonf_id ='" + f2 + "' ", connectchek2);
connectchek2.Open();

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

Tekyegah
سه شنبه 09 آبان 1396, 23:51 عصر
سلام
میتونی اون id رو با jquery بفرستی سمت سرورت .
اما از اونجایی که اسم جدولت آزمون هست !
اگه میخوای یه آزمون آنلاین راه اندازی کنید که جاوا اسکریپت گزینه مناسبی برای تایمر نیست .

general67
چهارشنبه 10 آبان 1396, 15:22 عصر
دو کار میشه کرد .اول اینکه کلا اشیا صفخه تو سمت سرور کنی و فقط تو سمت سرور بررسی کنه.
دوم اسفاده از تکنیک های آژاکس هستش.کلا میتونی تایمر بررسی کنی و کد سمت سرورت رو اجرا کنی.که مزیت های فراوانی داره.مثل رفرش نشدن صفحه و اجرای کد سمت سرور و ...
اما اگر بخوای با آژاکس راه بندازی با الگوریتم برنامتو تغییر بدی.واسه تایمرت یا سشن یا کوکی در نظر بگیری و این جور چیزا.

mahan206
جمعه 12 آبان 1396, 11:23 صبح
دو کار میشه کرد .اول اینکه کلا اشیا صفخه تو سمت سرور کنی و فقط تو سمت سرور بررسی کنه.
دوم اسفاده از تکنیک های آژاکس هستش.کلا میتونی تایمر بررسی کنی و کد سمت سرورت رو اجرا کنی.که مزیت های فراوانی داره.مثل رفرش نشدن صفحه و اجرای کد سمت سرور و ...
اما اگر بخوای با آژاکس راه بندازی با الگوریتم برنامتو تغییر بدی.واسه تایمرت یا سشن یا کوکی در نظر بگیری و این جور چیزا.

خیلی ممنون میشه توضیح بدین (کلا میتونی تایمر بررسی کنی و کد سمت سرورت رو اجرا کنی.) رو چطور بنویسم با مثال ساده
خیلی ممنون راهنمایی کردین

general67
جمعه 12 آبان 1396, 14:32 عصر
اگر میخوای با آژاکس کار کنی.اول باید کد های سمت سرور رو با وب متد راهندازی کنی.بدین صورت که دستورات درون کد باتون رو در وب متد قرار بدی.
دوم مقدار تایمر رو توی کوکی ذخیره کنی.که اگه صفحه رفرش شد مقدارش رو بتونی نگه داری.البته برای اینکه بتونی مقدار درستی داشته باشه یه وب متد هم برای اون بنویسی که بره زمان سرور رو بیاره.
تا کاربر نتونه با دستکاری زمان سیستم مقدار تایمر رو عوض کنه.
مثال:



public class Service1 : System.Web.Services.WebService
{
[System.Web.Services.WebMethod()]
public double ConvertTemperature(double dFahrenheit)
{
return ((dFahrenheit - 32) * 5) / 9;
}
}

البته این یه متد ساده هستش.اگر شما میخوای لیستی از سرور بارگذاری کنی باید نوع داده خروجی رو مشخص کنی.و موقع خوندن هم xml یا json رو مشخص کنی.
درسته این راه کمی مشکل به نظر میرسه اما مزایای خودش رو داره.

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




<asp:ScriptManager ID="ScriptManager1" runat="server"/>
<asp:Timer ID="Timer1" runat="server" Interval="1000" ontick="Timer1_Tick"/>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger controlid="Timer1" eventname="Tick" />
</Triggers>
<ContentTemplate>
<h2>&nbsp;&nbsp; time remaining :
<asp:Label ID="time" runat="server"></asp:Label></h2>
</ContentTemplate>
</asp:UpdatePanel>



int totalSeconds = 0;
int seconds = 0;
int minutes = 0;
int hours = 0;
string t = "";

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Session["time"] = 60;

}
}

protected void Timer1_Tick(object sender, EventArgs e)
{
Session["time"] = Convert.ToInt16(Session["time"]) - 1;

if (Convert.ToInt16(Session["time"]) <= 0)
{
}
}

mahan206
جمعه 12 آبان 1396, 15:44 عصر
اگر میخوای با آژاکس کار کنی.اول باید کد های سمت سرور رو با وب متد راهندازی کنی.بدین صورت که دستورات درون کد باتون رو در وب متد قرار بدی.
دوم مقدار تایمر رو توی کوکی ذخیره کنی.که اگه صفحه رفرش شد مقدارش رو بتونی نگه داری.البته برای اینکه بتونی مقدار درستی داشته باشه یه وب متد هم برای اون بنویسی که بره زمان سرور رو بیاره.
تا کاربر نتونه با دستکاری زمان سیستم مقدار تایمر رو عوض کنه.
مثال:



public class Service1 : System.Web.Services.WebService
{
[System.Web.Services.WebMethod()]
public double ConvertTemperature(double dFahrenheit)
{
return ((dFahrenheit - 32) * 5) / 9;
}
}

البته این یه متد ساده هستش.اگر شما میخوای لیستی از سرور بارگذاری کنی باید نوع داده خروجی رو مشخص کنی.و موقع خوندن هم xml یا json رو مشخص کنی.
درسته این راه کمی مشکل به نظر میرسه اما مزایای خودش رو داره.

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




<asp:ScriptManager ID="ScriptManager1" runat="server"/>
<asp:Timer ID="Timer1" runat="server" Interval="1000" ontick="Timer1_Tick"/>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger controlid="Timer1" eventname="Tick" />
</Triggers>
<ContentTemplate>
<h2>&nbsp;&nbsp; time remaining :
<asp:Label ID="time" runat="server"></asp:Label></h2>
</ContentTemplate>
</asp:UpdatePanel>



int totalSeconds = 0;
int seconds = 0;
int minutes = 0;
int hours = 0;
string t = "";

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Session["time"] = 60;

}
}

protected void Timer1_Tick(object sender, EventArgs e)
{
Session["time"] = Convert.ToInt16(Session["time"]) - 1;

if (Convert.ToInt16(Session["time"]) <= 0)
{
}
}




بازم ممنون بابات کمکتون من روشم رو عوض کردم و اومدم زمان ورود به سیستم طرف رو تو بانک ذخیره میکنم و بعد 30 دقیقه بهش اضافه میکنم میریزم تو متغییر مثلا s .یه ظرطم گذاشتم اگه طرف یه بار زمان براش تو بانک ساخته شده بود دیگه نتونه امتحان بده و کلا فقط یه بار میتونه صفحه رو ببینه و دیگه نمیتونه رفرش کنه.
الان مشکلی که دارم فقط اینه که چطور اطلاعات رو ارسال کنم (همون رویداد باتون رو صدا بزنم وقتی زمان سیستم برابر زمان s شد رویداد رو اجرا کنه.
از تایمر اسفاده کردم و شرط رو داخلش نوشتم اما جواب نداد وقتی تایم تموم شد.
protected void Timer1_Tick(object sender, EventArgs e)
{

while (zamaneAyande == DateTime.Now)
{
Button1.Click += new EventHandler(Button1_Click);
} {

}

general67
جمعه 12 آبان 1396, 22:41 عصر
دستورات درون رویداد رو درون یه تابع بریز و تابع رو فراخوانی کن.هم از باتون و هم از رویداد تیک تایمر.
اگر هم کار نکرد بزارش درون آپدیت پنل.:متفکر: