بایگانی برای تیر

باز شدن لینک‌ها در صفحه جدید در صفحات استاندارد وب

جمعه, ۳۰ تیر ۱۳۸۵

همانطور که توسعه‌دهندگان وب که استاندارد سازی صفحات وب را مورد توجه قرار می‌دهند می‌دانند، در HTML 4.0 Strict و XHTML 1.0 Strict طبق نظر W3C دیگر شناسه target در تگ <a> معتبر نیست و وجود ندارد. البته ورژن‌های Transitional هنوز شامل این شناسه هستند اما این تعاریف خود در حال کنار گذاشته شدن هستند!

استانداردهای وب شاید براساس ایده‌ال‌هایی نوشته می‌شود که به ذهن می‌آید. این ایده‌ها گرچه با هدف “انجام کار به بهترین شکل” وضع می‌شوند اما در عمل ممکن است با واقعیت‌های امروز وب سازگاری نداشته باشند. یکی از دلایل اصلی حذف شناسه target این است که معتقدند html باید تنها به اطلاعاتی که در یک پنجره نمایش داده می‌شود رسیدگی کند.

یکی از مشکلات اصلی در استاندارد کردن صفحات وب اینجاست که استفاده اصلی شناسه target که باز شدن یک لینک در پنجره یا tab جدید با استفاده از target=_blank است، همچنان در صفحات امروزی پر کاربرد است و استانداردها می‌گوید نباید از آن استفاده کنیم! این نوشته پاسخ به این سوال است که چگونه لینک‌ها را در صفحات جدید باز کنیم و استانداردها را نیز رعایت کنیم…

با استفاده از برنامه‌نویسی سمت کلاینت و مشخصا JavaScript می‌توانیم به این هدف دست یابیم. اولین سوالی که به ذهن می‌رسد این است: در شرایطی که نمی‌توانیم از شناسه target استفاده کنیم، چگونه مشخص کنیم که می‌خواهیم کدام لینک‌ها در صفحات جدید باز شود؟!

گرچه در استانداردهای جدید شناسه target حذف شده اما به‌جای آن شناسه‌ای با عنوان rel (مخفف Relationship) اضافه شده است. این شناسه در واقع قرار است در یک مستند، رابطه‌ی بین صفحه جاری و صفحه‌ای که پیوند به آن زده شده را مشخص کند. مقادیر تعریف شده‌ای که این شناسه می‌تواند بگیرد (next, previous, chapter, section و…) این وظیفه را برعهده دارند. کاری که ما می‌خواهیم انجام دهیم، استفاده از مقداری غیر معتبر برای شناسه rel برای مشخص کردن لینک‌هایی‌ست که می‌خواهیم در پنجره جدید باز شود! برای این لینک‌ها شناسه rel را با external مقداردهی می‌کنیم. در نتیجه لینک‌هایی که می‌خواهیم در صفحه جدید باز شود بصورت زیر خواهد بود.

قبلا:
<a href="document.html" target="_blank">external link</a>
از این به بعد:
<a href="document.html" rel="external">external link</a>

پیش از این مرورگرها با دیدن مقدار شناسه target می‌دانستند چگونه باید رفتار کنند اما اکنون مقدار داده شده به شناسه rel برای آنها بی‌مفهوم است. فعلا لینک‌های مورد نظر را با در نظر گرفتن استانداردها نشانه‌گذاری کردیم. حالا با استفاده از جاواسکریپت باید آنها را در صفحات جدید باز کنیم!

وظیفه‌ی اسکریپت ما این است که لینک‌هایی که مقدار شناسه‌ی rel آنها برابر external است را در یک پنجره جدید باز کند! این اسکریپت فقط یک‌بار و در زمانی که load صفحه تمام شد اجرا خواهد شد.
getElementsByTagName یک متد پرکاربرد DOM 1.0 است که توسط تمام مرورگرهای جدید شناخته می‌شود.

var anchor = document.getElementsByTagName('a');

متغیر anchor آرایه‌ای‌ست که هر المان آن معرف یک تگ <a> در متن است (در واقع این آرایه به تعداد لینک‌های صفحه عنصر خواهد داشت!). اکنون لازم است عناصر آرایه را در جستجوی لینک‌هایی که باید در صفحه‌ی جدید باز شوند پیمایش کنیم.


for (var i="0"; i<anchor.length; i++) {

برای پیدا کردن این لینک‌ها همانطور که پیش از این نشانه‌گذاری شده بودند، باید مقدار شناسه rel آنها برابر external باشد. همچنین چک می‌کنیم که لینک دارای شناسه href (که مسیر لینک را مشخص می‌کند) نیز باشد چراکه همانطور که می‌دانید تگ <a> فقط برای لینک کردن استفاده نمی‌شود و کاربردهای دیگری مانند نشانه‌گذاری (با شناسه name) نیز دارد که نباید کاری به آنها داشته باشیم!


if (anchor[i].getAttribute("href") && anchor[i].getAttribute("rel") == "external")

در نهایت باید مقدار شناسه target لینک‌های مورد نظر را با مقدار blank مقداردهی کنیم:


anchor[i].target = "_blank";

سوالی که اینجا مطرح می‌شود این است که آیا با توجه به اینکه شناسه target از استانداردها حذف شده – و در نتیجه مرورگرها به تدریج دیگر از آن پشتیبانی نخواهند کرد – می‌توان از آن به این شکل سود برد؟ در پاسخ باید بگویم بله! DOM که در واقع آبجکت‌ها و متغیرهای معتبر در جاواسکریپت را مشخص می‌کند کماکان این متغیر را شامل می‌شود.

اسکریپت کامل:
بهتر است پیش از اجرای دستورات چک کنیم که آیا مرورگر از getElementsByTagName پشتیبانی می‌کند یا خیر. اسکریپت کامل به این خواهد بود:


function init() {
if (!document.getElementsByTagName) return;
var anchor = document.getElementsByTagName('a');

for (var i="0"; i<anchor.length; i++) {
if (anchor[i].getAttribute("href") && anchor[i].getAttribute("rel") == "external")
anchor[i].target = "_blank";
}
}

در آخر نیز باید این تابع را یکبار و بعد لود شدن صفحه اجرا کنید:


window.onload = init;

مشکل حل شد!
Happy Programming

پ.ن: یکی از بحث‌های داغ که بین توسعه‌دهندگان وب مطرح است این است که آیا لازم است استانداردهای وب را رعایت کرد یا خیر؟ گرچه دلایلی وجود دارد که توسعه‌دهندگان وب را به رعایت استانداردها ترغیت می‌کند اما عده‌ی زیادی فقط استانداردها را تا جایی رعایت می‌کنند که صفحه وب‌شان در مرورگرهای مختلف بدرستی نمایش داده شود. شخصا سعی می‌کنم تا جایی که بتوانم استانداردها را رعایت کنم اما اصراری ندارم که صفحات کاملا استاندارد باشند. چراکه با توجه به اینکه اکثر صفحات امروزه بصورت دینامیک پیاده‌سازی می‌شوند و محتویات آنها عموما توسط کاربرانی که اطلاعات چندانی از این مسائل ندارند به روز می‌شود، استاندارد بودن همیشگی یک صفحه بیشتر شبیه به یک افسانه است!

-------------------------------------------------
دیگر مقالات کامپیوتری
CSS expression
WeblogPing و XML-RPC!
CSS Layout با استفاده از absolute positioning، مشکلات و راه حل‌ها
کار با Alternate Style Sheets و Style Sheet Switch

جمعه, ۲۳ تیر ۱۳۸۵

یعنی می‌شه؟!

شنبه, ۱۷ تیر ۱۳۸۵

آقا / خانم بد دوره زمونه‌ای شده! فکر کن! یک روز صبح بیدار می‌شی می‌ببینی مُردی! شب هم بالاخره آدم خوابش می‌گیره نمی‌شه نخوابید!

جمعه, ۱۶ تیر ۱۳۸۵

برای جمع‌نوشت:
دلم برای بچه بودن تنگ شده… برای روزهایی که می‌شد بی‌دریغ بود… برای روزهایی که فردا معنی نداشت، هرچی بود همون لحظه بود. نه فرار از خیلی‌ها از ترس اینکه فردا شاید نداشته باشیم‌شون، نه وحشت از دست دادن چیزهایی که دوستشون داشتیم. دلخوری‌ها، منت‌کشی‌ها همه بازی بود. یه بازی که همه‌مون می‌دونستیم آخرش چیه! اگر کدورتی بود، باعث دشمنی نبود! تازه دوستی‌ها رو محکم‌تر هم می‌کرد…
خلاصه اینکه دلم بدجوری لک زده برای یکبار دیگه بچه شدن…

هنوزم بچه‌ام، هنوزم بچگی می‌کنم! اما اطرافیانم بزرگ شدن، بچگی نمی‌کنن…!

پنجشنبه, ۱۵ تیر ۱۳۸۵

۱. مثل دانشجوهای دانشگاه آزاد که فکر می‌کنند چون پول دادن باید همه‌ی واحدها رو راحت پاس کنن، آلمان‌ها هم بدشون نمی‌یومد هرطور شده از امتیاز میزبانی‌شون سواستفاده کنن. اینو می‌شد توی چشمای تک‌تک بازیکنان آلمان دید بعد از هر اتفاقی که داور می‌تونست جریان بازی رو عوض کنه! داستان مربی و تماشاگران هم همین بود…
اما دانشجوهای دانشگاه آزاد واحدها رو پشت سر هم می‌افتن، میزبانی آلمان هم نمی‌تونه به دادش برسه… ایتالیا اونقدر خوب بود که هیچ چیزی نتونه به داد آلمان برسه… هیچ چیز!

۲. اگر پرتغال به فینال می‌رسید، از دیدن یک فینال فوق‌العاده لذت می‌بردم بدون اینکه برام اهمیتی داشته باشه که کدوم تیم قهرمان می‌شه! فرانسه حقش نبود به فینال برسه… اصلا حقش نبود. ایتالیا اما کاملا برعکس!

۳. کلینزمن در تیم آلمان یک مترسک بیشتر نبود. یک شومن تمام عیار که کنار زمین بایستد، با هر موقعیت خطرناکی فریاد بکشد و حسرت بخورد، گاهی از اشتباهات داوری از خود بی خود شود. مردی که حتی وقتی بازیکنانش توپی رو با فرسنگ‌ها فاصله از کنار دروازه به بیرون زدند، با اعتماد به نفس برای آنها دست بزند – گویی چه موقعیت خطرناکی ایجاد کرده‌اند. هرچه از بزرگ بودن و مغزمتفکر بودن او بگویند، من باور نمی‌کنم! اسکولاری در بازی آلمان – پرتغال درس مربیگری خواهد داد! شک نکنید!