PDA

View Full Version : حرفه ای: متدی برای باز و بسته کردن یک div



fazel-d
پنج شنبه 07 مرداد 1389, 16:41 عصر
من یک دکمه دارم که ارتفاع div رو برابر با 200 می کنه و دکمه hide من با استفاده از setInterval میاد و تابع hide من رو با زمان 20 میلی فراخوانی می کنه.تا زمانی که ارتفاع div برابر با صفر بشه.
مشکلی که وجود داره اینه که برای اولین با خوب عمل می کنه ولی زمانی که دوباره دکمه show رو که می زنم، بدون اینکه دکمه hide رو بزنم به خودی خود div بسته می شه.
احساس می کنم که متد setInterval به صورت پشته کار می کنه و در حافظه باقی می مونه

کد Show:
function show(id) {
var div;
if (id == null) {
div = 'popup'
}
else div = document.getElementById(id);

div.setAttribute('style', 'height:350px');
}


کد Hide:
function hide(divId) {
if (divId == null) {
divId = 'popup';
}

var div = document.getElementById(divId); //.firstChild.nodeValue;


var h = div.style.height;

if (h != null) {
h = h.split("px")[0]; // split number of height
}

var x ;
if (h > 0) {
h -= 1;
div.style.height = h + 'px';
x = setInterval('hide()', 30);
}
else {
clearInterval(x);
}
}

exlord
شنبه 09 مرداد 1389, 10:15 صبح
function show(id) {
var div;
if (id == null) {
id = 'popup'
}
div = document.getElementById(id);
div.style.height = '350px';
}


function hide(divId) {
if (divId == null) {
divId = 'popup';
}

var div = document.getElementById(divId); //.firstChild.nodeValue;


var h = div.style.height;

if (h != null) {
h = h.split("px")[0]; // split number of height
}

if (h > 0) {
h -= 2;
div.style.height = h + 'px';
setTimeout('hide()', 20);
}
}

اولا : زمانی که از interval استفاده میکنی نباید ائنو تو همون متدی بنویسی که داری صداش میکنی .... چون interval تا زمانی که clear نشده به کارش ادامه میده ....
دوما شما وقتی x رو درون متد تعریف میکنی هر بار که متد اجرا میشه یه interval جدید دروم این x قرار میگیره و reference به Interval های قبلی از بین میره در حالی که خودشون تو حافظه باقی میمونن و به کارشون ادامه میدن و clear هم فقط آخرین interval ساخته شده رو حذف میکنه
سوما : متد show خودشم مشکل داشت .......

mehdi.mousavi
یک شنبه 10 مرداد 1389, 00:19 صبح
احساس می کنم که متد setInterval به صورت پشته کار می کنه و در حافظه باقی می مونه


سلام.
متود setInterval تابع مورد نظر شما رو تا وقتیکه clearInterval رو فراخوانی نکرده اید، در بازه زمانی مورد نظر اجرا میکنه. برای اینکه این کار یک بار انجام بشه، میتونید از setTimeout استفاده کنید.

اما در مورد setInterval حواستون باشه که اگر تابع مورد نظر، در مدت زمانی کمتر از interval شما اجراش به پایان نرسه، این چرخه میتونه مدام تکرار بشه و Browser رو در نهایت به زانو در بیاره. روش بهتر، استفاده از setTimeout و فراخوانی مجدد این متود، در انتهای تابع هستش (اگر میخواهید کاری رو در بازه های مشخصی بیش از یکبار انجام بدید).

موفق باشید.