קיימות אינספור גירסאות סקריפט להשגת מטרה זהה. אחרי עשרות ווריאנטים שכתבתי בעצמי, החלטתי לכתוב גרסת מאסטר בה אני עושה שימוש תחת כל עץ רענן.
דוגמה עובדת
לגרסה זו כמה יתרונות, הראשון שבהם הוא שניתן לטפל באובייקט אחד או יותר בסבב יחיד. יתרון שני הוא שהפונקציה מסוגלת להציג אובייקט, להסתירו או להפוך את המצב הנוכחי שלו.
העברת פרמטרים
הפרמטר הראשון שאני מעביר בקריאה לפונקציה הוא ה-id של האובייקט או האובייקטים בצורת מערך, למשל-
בדוגמא זו אני רוצה לבצע את הפעולה על האובייקטים ‘foo’ ו- ‘bar’.
שמות האובייקטים מופרדים בפסיק והם מועברים כמחרוזת לכן כל אחד מהם עטוף במרכאות והאיבר כולו עטוף בסוגריים מרובעים, המכריזים על המשתנה כמערך.
['foo','bar']
הפרמטר השני שאני מעביר הוא סוג הפעולה שאני רוצה לבצע. ישנן שלוש אפשרויות:
- show הצגת אובייקט
- hide הסתרת אובייקט
- toggle היפוך התצוגה של אובייקט, מ-show ל- hide וההיפך
וכולם ביחד
קריאה לפונקצייה יכולה להראות כך:
showHide(['foo','bar'],'show')
או בדוגמה מהחיים:
<a href="#" onClick="showHide(['foo','bar'],'show')">Peek-A-Boo</a>
אגב, במידה ואתם לא מתכננים לבצע את הפעולה על יותר מאובייקט אחד, ניתן להשמיט את הסוגריים המרובעים בקריאה לפונקציה.
והפונקציה עצמה: (תנוח לה בחדווה בין תגיות ה-HEAD)
<script>
function showHide(ids,action) {
for (var i=0;i < ids.length;i++) {
var elm = document.getElementById(ids[i]);
if (action=='show') {elm.style.display = ''};
if (action=='hide') {elm.style.display = 'none'};
if (action=='toggle') {
elm.style.display = (elm.style.display=='none') ? '' : 'none';
}
}
}
</script>
זהו, תהנו!

05/06/06, 14:59
כמה השגות:
1. ומה אם קבעת מראש שהאלמנט נעלם ואז אתה רוצה להציג אותו? הרי כשתקבע את style.display=” אז לא יקרה שום דבר, תחזיר אותו למצב הדיפולטי שהוגדר בCSS שלו.
2. נגיד ויש לי אלמנט שנמצא בתוך משתנה JS ואני רוצה להסתיר אותו, הרי ששליחת ה-ID שלו לפונקציה תגרום לחיפושו מחדש. לתשומת ליבך צריך לתקן את זה :-).
05/06/06, 15:08
1. המצב הדיפולטיבי שלו לא נקבע ע”י הסטייל אלא ע”י הדום. לכן, נכון שהוא יחזור למצב הדיפולטיבי, והמצב הזה הוא show
תבדוק, זה עובד
2. זה נכון. אבל מהנסיון שלי, רב הפעמים הגישה להסתרה והצגה של אלמנטים היא פנייה ישירה אליהם, כך שזה פוגע ב-90 אחוז מהמקרים.
05/06/06, 22:21
1. לא נכון, נגיד וקבעתי בקובץ CSS חיצוני את ה-display ל-none.
אז זה הופך להיות הערך הדיפולטי של המאפיין.
הפונקציה שלך תעבוד רק במקרה והגדרת פרטנית לאלמנט במאפיין ה-style שלו את ה-display:none (כי אז אתה מבטל את ההגדרה הזאת והדיפולטי מתקיים), אבל כאשר אתה מגדיר את ה-display:none חיצונית לאלמנט (בתוך תגית style או CSS חיצוני) אז הוא הופך להיות הדיפולטי.
05/06/06, 23:18
אוקיי, אני מבין עכשיו למה התכוונת.
אבל יש לי תשובה טובה! (חובש את כובע ה-UI)
באופן עקרוני, אם אתה מתכנן להסתיר אובייקט ע”י שימוש בסקריפט צד לקוח, אז אתה צריך לחשוף אותו באותה דרך, וההיפך.
וחוץ מזה שזו אמירה שנשמעת טוב, יש בה הגיון פנימי- בדרך זו, משתמש שאין לו תמיכה, או שביטל את התמיכה בסקריפטינג, לא יאבד פונקציונליות\מידע\תוכן.
31/07/06, 0:42
שלום וברכה, ונעים מאוד לגלות את הבלוג שלך.
רק הערה אחת על הסדר.
הפונקציה הזאתי בזבנית במקרה של ילד אחד במערך.
להחזיק מערך שלם לאוביקט אחד זה בזבזני ביותר.
(ואולי אני טועה אם יווצר בכלל מערך במקרה של ילד בודד, אבל כך זה נראה לי)
חבל על חלב שנשפך…
31/07/06, 11:23
תודה וברוך הבא.
בקשר לפונקציה, כתבתי למטה שבמידה ואין כוונה להחיל את הפונקציה על יותר מאובייקט אחד, ניתן להשמיט את הסוגריים המרובעים כך שהמשתנה לא יאותחל כמערך.
מעבר לזה, ויש פה אנשים שיתקנו אותי אם אני טועה, סביר שאין הבדל בין משתנה רגיל ומערך שמכיל איבר אחד.
31/07/06, 15:06
טוב, ראש הצוות שלי, שהוא מבחינתי אלוהים בכל מה שקשור לקוד, התבונן איתי על הקוד ואמר שזה מאוד זניח מבחינת יעילות, הנושא של איבר אחד במערך לעומת החזקת אוביקט בפוינטר.
אבל אני רוצה לשאול אותך שאלה, כאשר יש לך ילד אחד, ואתה מוציא את הסוגריים המרובעים, אתה לא מקבל שגיאה?
כי אתה תקבל תוצאת length שגויה על בדיקה שכזאת.
אתה תקבל את אורך המחרוזת ולא מיקומה ב”מערך” שאינו קיים…
31/07/06, 15:17
אמת.
ניתן להעביר אובייקטים רק בצורת מערך.