-
مشکل با event ها
با سلام .
من با نسبت دادن event ها به DOM Objects مشکل دارم .
قطعه قطعه کد ها را تست کردم، تا مشکلی از نظر scope,null & undefined objects,... نداشته باشند .
کد ها را تا جایی که ممکن بود ساده کردم ، تا جایی که به test تبدیل شدند .
از jslint.com, firebug برای پیدا کردن error ها استفاده کردم.
به جای کدهای native از کتابخانه jQuery و prototype استفاده کردم .
نتیجه اینکه کدهای اصلی هیچ مشکلی ندارند و با inline script کار میکنند ،مانند این:
[
کد:
<button type="button" onclick="function call"></button>
اما از هر روشی برای نسبت دادن event استفاده میکنم، بی اثر است. :19:
مانند این :
کد:
var element=getElementByclassName("foo");
element.onclick=bar();
element.addEventListener("click",bar(),false)
or
jQuery(".foo").click(bar());
وقتی event را به این ترتیب نسبت میدهم ، هنگام load صفحه ،event بدون نیاز به کلیک یا mouseover یا هر کار دیگر اجرا میشود ، ولی پس از آن دیگر نه ...
من از چند روش و
کد:
jQuery(document).ready();
استفاده کرده ام .
(واضح است اسکریپت ها بر localhost اجرا میشوند . )
-
آیا تابع getElementByClassName رو قبلاً تعریف کردید؟ چون همچین تابعی فکر نمیکنم اصلاً وجود داشته باشه!
اونی که هست متد getElementsByClassName هست که میتونید روی نودها اجرا کنید. در ضمن این متد هم یک المنت رو برنمیگردونه که بتونید مستقیماً رویداد رو بهش وصل کنید. بلکه یک آرایه برمیگردونه که باید بزارید توی حلقه تا رویدادها رو بهش وصل کنید:
کد:
for(var i=0, elems = document.getElementsByClassName('foo'), n=elems.length; i<n; i++) {
elems[i].onclick = function(e) {
// function body
}
}
البته توی این کد که نوشتم رویداد اتچ نمیشه بلکه به طور کامل ریپلیس میشه.
اتچ کردن رویدادها با جاوا اسکرپت یه مقدار مشکل کراس براوزر ایجاد میکنه بنابراین باید دو سه تا کد بنویسید که همه مرورگرها رو پشتیبانی کنه. اما بیشتر فریمورکها این مشکل رو در نظر گرفتند و کار رو ساده کردند. مثلاً با کتابخانه مورد علاقه من dojo اینجوری میشه :دی
کد:
dojo.query('.foo').connect('onclick', function(e) {
// function body
});
من jQuery استفاده نمیکنم سینتکسش دقیق یادم نیست (مطمئن هم نیستم که اتچ میکنه یا ریپلیس) اما فکر میکنم با جی کوئری هم اینطوری بتونید همین کار رو انجام بدید:
کد:
$('.foo').click(function() {
// function body
});
این قسمت در کد شما اشتباه هست:
کد:
jQuery(".foo").click(bar());
به این دلیل که باید هندل تابع رو پاس بدید به رویداد اما در کد شما مقدار بازگشتی از تابع پاس داده میشه. درستش اینه:
کد:
jQuery(".foo").click(bar);
وقتی که به صورت ()bar بنویسید، اسکرپت تابع bar رو اجرا میکنه و نتیجه رو ذخیره میکنه در حالی که باید تابع رو ذخیره کنه و در هنگام فراخوانی رویداد اجرا کنه
-
سلام.
از راهنماییتان متشکرم. :7:
مشکل من دقیقا همین بود .
به همین دلیل با لود شدن صفحه ، event اجرا میشد به جای نسبت داده شدن.
Dope.getElementByClass را تعریف کرده ام ، تنها یک نتیجه دارد.