PDA

View Full Version : سوال: مشکل در اجرای تابع در رویداد mouseDown



alismith
پنج شنبه 11 فروردین 1390, 14:48 عصر
سلام
من یه تابع در رویداد mouseDown تعریف کردم که قرار هستش با این رویداد صدا زده بشه و تا زمانی که این رویداد برقرار هستش به صورت ثانیه ای یک متغییری افزایش ارزش پیدا کنه، تا جایی که شرط قرار داده شده در تابع برقرار شود و رویداد جدیدی که در شرط آمده رخ دهد اما مشکل اینجاست که این تابع بعد از mouseDown فراخوانی نمیشه. راه حل چیست؟


<script language="javascript">

$(document).ready(function(){
var ix=0;
var MD = false;
$("#btn").mousedown(function(){
MD = true;
if(MD){

function timer(x){
ix = x;

if(ix==2){

$("#label").show("slow");



}else{
++ix;
setTimeout("timer(ix)",1000);
}
}
setTimeout("timer(ix)",1000);
}
});

});

</script>

<div style="position: absolute; left: 134px; background:#CCC; height: 100px; width: 100px; top: 19px; display:none;" id="label"></div>

<br/><br/>

<input type="button" id="btn"/>


با تشکر

mehdi.mousavi
پنج شنبه 11 فروردین 1390, 15:28 عصر
سلام.
می تونید بدین شکل عمل کنید:

$(function () {
var down = false, counter, label = $('#label').hide();
var btn = $('#btn').mousedown(function () {
down = true;
counter = 0;
start();
}).mouseup(function () {
down = false;
});

function start() {
var tid = setInterval(function () {
if (!down) {
clearInterval(tid);
label.show('slow');
}
else {
btn.val(++counter);
}
}, 100);
}
});


در واقع یک flag تعریف می کنید، هر وقت mouse رفت پایین اون flag رو true می کنید، و هر وقت دکمه mouse رها شد، اونو false می کنید. بعد با استفاده از این flag منطق مورد نظر رو پیاده سازی می کنید... در کدی که نوشتم تا وقتی که Button رو فشار داده اید و پایین نگه داشته اید، هر 100 میلی ثانیه یک واحد به Label اون Button اضافه میشه. هر وقت هم رها کنیدش، label نمایش داده میشه...

موفق باشید.

alismith
پنج شنبه 11 فروردین 1390, 18:03 عصر
خیلی ممنون اما منظور من این بود که مثلا شمارنده به 2 رسید اون label به نمایش در بیاد.
من کد شما رو تغییر دادم اما باز مشکل حل نشد، لطفا یکبار خودتون کد رو اجرا کنید، یک بار چند ثاینه mouseDown کنید و یک بار فقط یک کلیک ساده، بعد متوجه منظور من می شوید


<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script language="javascript">
$(function () {
var down = false, counter, label = $('#label').hide();
var btn = $('#btn').mousedown(function () {
label.hide();
counter = 0;
start();
}).mouseup(function () {
alert(counter);
if(counter < 2){
label.hide();
clearInterval(tid);
}

});

function start() {
var tid = setInterval(function () {
if (counter == 2) {

label.show('slow');
clearInterval(tid);
}
else {
btn.val(counter);
++counter;

}
}, 300);
}
});

</script>

</head>
<body>
<div style="position: absolute; left: 134px; background:#CCC; height: 100px; width: 100px; top: 19px; display:none;" id="label"></div>
<br/><br/>
<input type="button" id="btn"/>
</body>
</html>


با تشکر

alismith
پنج شنبه 11 فروردین 1390, 18:09 عصر
آقا مشکل حل شد چون متغییر tid داخل تابع تعریف شده بود رویداد mouseUp دسترسی ای به متغییر نداشت با تعریف اون در خارج از تابع و به صورت Global مشکل حل شد
خیلی ممنون