مشکل dojo.connect با IE6 و IE7?!

neopersia

Member
سلام

این متد رو ببینید:
کد:
/**
 * @param string $prefix to be prepended to the selector query to limit the search scope
 * @param string|object $refNode element ID or DOM node as reference for the search to limit results also better performance
 */
np.parseLinks = function($prefix, $refNode) {
	$prefix = $prefix || '';
	$refNode = $refNode || null;
	dojo.query($prefix+' a', $refNode).connect('onclick', function($evt) {
		var $node = $evt.target;
		if (np.isParsable($node) && np.isSysLink($node.href)) {
			$evt.preventDefault();
			np.loadPage($node.href);
		}
	});
};
ساده بگم با همه مرورگرها کار میکنه به جز IE زیر 8! البته مشکل از dojo.connect نیست چون بعضی دیگه از رویدادها رو که تست کردم توی همه IE ها کار میکنه.
میخوام با این متد onclick لینکهایی رو که شرایطشو دارن در اختیار بگیرم. فعلاً برای حل مشکل از این استفاده میکنم اما تگ onclick لینک رو بلااستفاده میکنه چون false برمیگردونه:
کد:
np.parseLinks = function($prefix, $refNode) {
	$prefix = $prefix || '';
	$refNode = $refNode || null;
	dojo.query($prefix+' a', $refNode).forEach(function($node) {
		if (!$node.getAttribute('onclick', 2) && np.isParsable($node) && np.isSysLink($node.href)) {
			$node.onclick = function() {
				np.loadPage($node.href);
				return false;
			}
		}
	});
};

نمیخوام درگیر ضمیمه کردن رویداد ها بشم کسی راهی به ذهنش میرسه که با همون dojo.connect بشه انجامش داد؟
 
آخرین ویرایش:

eAmin

Well-Known Member
سلام حاجی

سوالاتت، مثل خودت نون و آب دارن ( Professional )


این قسمت رو نگرفتم چی شد:
میخوام با این متد onclick لینکهایی رو که شرایطشو دارن در اختیار بگیرم. فعلاً برای حل مشکل از این استفاده میکنم اما تگ onclick لینک رو بلااستفاده میکنه چون false برمیگردونه:
یعنی هدفت از نوشتن این متد چی بوده؟
یه توضیحی هم بده که connect مال چیه؟ ( تا حالا با هیچ Framework ی کار نکردم، به غیر از mootools اونم بصورت خیلی محدود. )

من کدت رو اینجوری تغییر دادم، امتحان کن ببین همون چیزی هست که می خوای یا نه.
کد:
np.parseLinks = function($prefix, $refNode) {
	$prefix = $prefix || '';
	$refNode = $refNode || null;
	dojo.query($prefix+' a', $refNode).connect('onclick', function($evt) {
		var $node = (!!window.event) ? $evt.srcElement /* IE */ : $evt.target;
		if (np.isParsable($node) && np.isSysLink($node.href)) {
			if ($evt.preventDefault) {
				$evt.preventDefault();
			} else {
				$evt.returnValue = false;
			}
			np.loadPage($node.href);
		}
	});
};


خوشم میاد از Dojo استفاده می کنی ( چون خودم ازش خوشم می یاد ;) )!
موفقیت رفیق.
 

neopersia

Member
سلام امین جون
خوبی برادر؟ ما رو نمیبینی خوشحالی? :D

عرضم به حضور شما این متد رو نوشتم تا باهاش هر لینکی که معادل ای جکس تو سیستم داره با ای جکس هندل بشه. ممکن هم هست بعضی از لینکها onclick خودشونو داشته باشن برای همین نمیخواستم متد onclick رو ریرایت کنم

در مورد connect هم شما که خودت استادی من چی بگم :) اینطور که من فهمیدم (تو این مدلی که نوشتم) تابع پارامتر دومی رو برای المنتهای مچ شده با کوئری به رویدادی که توی پارامتر اول مشخص شده ضمیمه میکنه. یه چیزی تو مایه های attachEvent و addEventListener به صورت کراس براوزر هست (اگه اشتباه میگم بگو)

بابت جوابت ممنون. تفاوت شیء event تو IE نکته ظریفی بود به ذهن من نرسیده بود. ولی من که دیگه دارم دیوونه میشم از دست این IE! الان همون کد قبلی رو داره اجرا میکنه بدون خطا! نمیدونم چی شده شایدم مشکل از IE Tester بود

الانم دوباره دارم با همین IE سر و کله میزنم این دفعه دیگه میخوام یه متد prototype به Element اضافه کنم که جناب IE اجازه نمیده. برم ببینم میتونم چیزی از behavior و فایلهای htc سر در بیارم که کمک کنه یا نه :(
 

Darkknight

Member
هر چی می کشیم از دست این ie می کشیم
نصف کدها توی ie درست عمل نمی کنند
 

neopersia

Member
بدبختی اینه که IE با این همه بی شعوری که به خرج میده بیشترین کاربرد رو مخصوصاً توی ایران داره!!
حالا ورژن 8 یه کم (فقط یه کم نه بیشتر) بهتر شده ولی بازم بعضی از ارورهای نسخه های اولیه 6 رو داره تکرار میکنه که توی 7 برطرف شده بود!

شکایت از این IE که تمومی نداره بگذریم :mad:

فقط رو نکته امین یه کم فکر کردم برام عجیب بود که preventDefault بدون مشکل داره با IE کار میکنه چون قاعدتاً باید فرق داشته باشه. یه کم فایل dojo.js رو زیر و رو کردم دیدم این تابع رو به عنوان preventDefault برای رویدادهای IE اضافه کردن:
کد:
function(){
	this.bubbledKeyCode=this.keyCode;
	if(this.ctrlKey){
		_124(this,0);
	}
	this.returnValue=false;

حدس میزنم برای بقیه متدها و پراپرتی ها هم همین کار رو کرده باشن این یعنی یه کم از دردسرهای IE کم میشه :oops:
 

eAmin

Well-Known Member
سلام امین جون
خوبی برادر؟ ما رو نمیبینی خوشحالی? :D

عرضم به حضور شما این متد رو نوشتم تا باهاش هر لینکی که معادل ای جکس تو سیستم داره با ای جکس هندل بشه. ممکن هم هست بعضی از لینکها onclick خودشونو داشته باشن برای همین نمیخواستم متد onclick رو ریرایت کنم

در مورد connect هم شما که خودت استادی من چی بگم :) اینطور که من فهمیدم (تو این مدلی که نوشتم) تابع پارامتر دومی رو برای المنتهای مچ شده با کوئری به رویدادی که توی پارامتر اول مشخص شده ضمیمه میکنه. یه چیزی تو مایه های attachEvent و addEventListener به صورت کراس براوزر هست (اگه اشتباه میگم بگو)

بابت جوابت ممنون. تفاوت شیء event تو IE نکته ظریفی بود به ذهن من نرسیده بود. ولی من که دیگه دارم دیوونه میشم از دست این IE! الان همون کد قبلی رو داره اجرا میکنه بدون خطا! نمیدونم چی شده شایدم مشکل از IE Tester بود

الانم دوباره دارم با همین IE سر و کله میزنم این دفعه دیگه میخوام یه متد prototype به Element اضافه کنم که جناب IE اجازه نمیده. برم ببینم میتونم چیزی از behavior و فایلهای htc سر در بیارم که کمک کنه یا نه :(
دست رو دلمان نزار که تنگ است بسیــــــار برای شما:sad:
شما خوب باشی انگار دنیا رو بهمون دادن.

حدس می زدم، یه چیزی تو مایه های همون Ajax Injector مسیح.
نه اشتباه که نیست، خودمم یه نگاه سر سری انداختم، درضمن نظر لطفته.

در مورد ایجاد یه متد جدید برای HTMLElement یا پیاده سازی اون توی IE کاملترینش که اینه: http://www.jslab.dk/epe.introduction.php
این یکی هم آموزش ساده ای هست: http://www.geekdaily.net/2007/06/18/javascript-htmlelement-in-ie/
با behavior: http://blog.motane.lu/2007/09/20/elementprototype-in-ie/

فقط رو نکته امین یه کم فکر کردم برام عجیب بود که preventDefault بدون مشکل داره با IE کار میکنه چون قاعدتاً باید فرق داشته باشه. یه کم فایل dojo.js رو زیر و رو کردم دیدم این تابع رو به عنوان preventDefault برای رویدادهای IE اضافه کردن:
کد:
function(){
	this.bubbledKeyCode=this.keyCode;
	if(this.ctrlKey){
		_124(this,0);
	}
	this.returnValue=false;

حدس میزنم برای بقیه متدها و پراپرتی ها هم همین کار رو کرده باشن این یعنی یه کم از دردسرهای IE کم میشه :oops:
خب پس معلوم شد الکی از dojo خوشم نمی یاد!
البته فکر می کنم، الآن اکثر فریم ورکها این رو پیاده سازی کرده باشن.

نا مرتبط:
یه چیزی بگم؟ داره خفم می کنه!
این روزا یارو بلد نیست، جاوااسکریپت با کدوم "ج" نوشته می شه، یا اصلا JavaScript چی هست، می ره سراغ jQuery! همش هم سر تبلیغات بیش از اندازه این مایکروسافت هست، و اغراقهایی(!؟) که در موردش می شه.
البته من از همون اول هم زیاد از jQuery خوشم نمی اومد، دلایلش رو هم فکر کنم خودت بدونی...
 
آخرین ویرایش:

neopersia

Member
سلام

شرمنده چند روز اینترنت نداشتم کلاً فراموش کرده بودم :)

آره یه جورایی شبیه همون Ajax Injector مسیح هست. البته منم سورس اونو ندیدم ولی همون اوایل که نوشته بود تو فروم خودمون خونده بودم.
یه فرق کوچیک هم داره که این این چیزی که دارم مینویسم تا حالا بیشتر از 1500 خط جاوا اسکرپتش شده :green:

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


منم اینو اولش با JQuery شروع کردم ولی یه کم که پیش رفتم پشیمون شدم و از اول با Dojo نوشتم. اینطور که گفته میشه کارایی Dojo مخصوصاً توی مرورگرهای قدمیمی تر بهتره ولی کلاً من بیشتر باهاش حال میکنم :)


راستی مشکل من با این dojo.connect حل که نشد هیچ پیچیده تر هم شد! یه جورایی دیگه واقعاً عجیب و قریب شد.

مشکل اول اینجوری بود که کدم توی IE6 , 7 کار نمیکرد ولی اون که حل شد بعد دیدم وقتی که روی متن لینکها کلیک میکنم ایجکس بدون مشکل کار میکنه اما وقتی که روی لینک تصاویر یا آیکن ها کلیک میشد صفحه جدید رو معمولی باز میکرد!! هر کار هم کردم درست نشد یعنی اصلاً نفهمیدم عیبش از کجا بود. حدس میزنم دلیلش روش وارد کردن کدهای لود شده XML توی صفحه HTML بود چون هر بار جدا تست میکردم درست کار میکرد. دست آخر دیدم پروژه داره دیر میشه با همون onclick نوشتم تا تحویل بدم

داره بد جوری رو اعصابم رژه میره فرصت کنم ریز ریزش میکنم تا مشکل رو پیدا کنم :D
 

جدیدترین ارسال ها

بالا