שלח תשובה

זירת השאלות

1925
צפיות
52
תשובות

וובאפדייט מספר 3

,‏ 16 במרץ, 2005

גיליון וובאפדייט מספר 3 מופץ כרגע לכלל רשימת התפוצה של וובמאסטר.

תגובות לגיליון יש לשרשר לשירשור זה.


בהזדמנות זו אנחנו רוצים להודות לאוריקס על העבודה הניפלאה בריכוז וכתיבת החומרים למגזין וובאפדייט


תהנו

תגיות:

52 תשובות

  1. Silver Strike הגיב:

    בקשר לאתגר ה-css.
    לא אמור להיות לו מבנה html בסיסי?

    או שאני מבלבל בין שני אתגרים שונים?

  2. ניר טייב הגיב:

    אתה מבלבל
    כנראה הצעתי לא התקבלה או שבכלל לא הגיעה אליהם

  3. ניר טייב הגיב:

    הפתרון לאתגר
    זה גם היה כתוב בגיליון

  4. ניר טייב הגיב:

    אופס HTML ניסיתי לעלות |חבול|

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
        "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;
    <html xmlns="http://www.w3.org/1999/xhtml&quot; xml_lang="he" >
    <head>
    <title> New Document </title>
    <meta name="Author" content="" />
    <meta name="Keywords" content="" />
    <meta name="Description" content="" />
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=windows-1255" />
    <style type="text/css">
        div{width:500px;height:500px;border:1px solid black;}
        div.d1{line-height:500px;}
        div.d2 span{vertical-align:middle;}
    </style>
    </head>

    <body>
    <div class="d1">
        My Name Is Nir Tayeb
    </div>
    </body>
    </html>

  5. ניר טייב הגיב:

    הגיליון הגיע אליי ב-GMAIL
    עם ג'יבריש וכל ניסיון לשנות קידוד לא עזר

  6. קבל ח"ח על ההתמצאות בגוגל
    זה גם התשובה הראשונה שאני מצאתי

    עכשיו תמרכז את הטקסט למטה (באותו קלאס)

  7. שכחתי להחליף יוזר
    וכמובן – תכניס יותר משורת טקסט אחת שם.

    אתה צריך לדמות valign באופן מלא.

  8. ניר טייב הגיב:

    אפשר בדרך אחרת
    לשנות את הסטייל:

    <style type="text/css">
        div{width:500px;height:500px;border:1px solid black;position:relative;}
        div.d1 span{position:absolute;bottom:25%;top:25%;}
    </style>

  9. ניר טייב הגיב:

    אוריקס – לא הבנתי למה
    דרסת את קונסטרוקטור ברירת המחדל ויצרת אחד שהוא בדיוק כמוהו (שכידוע לך ברגע שיוצרים בנאי משלך אז בנאי ברירת המחדל חדל לתהקיים ),
    זה יכול ליצור בעיות לאלו שמשתמשים בו, הרבה יותר נכון (לדעתי) זה לחייב נתינת Command  בקונסטרוקטור (כלומר אין יותר בנאים אחרים חוץ מזה שמקבל את קומנד)
    ולאפשר את ה-property  שיצרת עבור אובייקט הקומנד.

    לפי ההיגיון למה ליצור אובייקט אם לא צריך אותו באותו רגע ?!

    אשמח אם תסביר לי

  10. אוריקס הגיב:

    בשביל לתת לך קצת יותר כיוון
    הפתרון הוא CSS1. תשכח מ BOX MODEL

  11. אוריקס הגיב:

    ….
    יצרתי קונסטרקטור ברירת מחדל בדיוק מהסיבה שאתה ציינת – פשוט כי אני לא רציתי שלא יוכלו להשתמש בו.

    *אף פעם* אל תיצור אובייקט בלי קונסטרקטור ברירת המחדל – פשוט לא עושים את זה. שים לב שתמיד לאובייקטים המובנים שאתה יוצר של בשפה איתה אתה עובד (אם זה C# או ג'אווה) יש קונסטרקטור ברירת מחדל. תמיד. אסור לך להגביל את המשתמשים שלך – הקלאס צריך לעבוד תמיד, אחרת אין טעם בזה שאתה כותב קוד בשביל מישהו אחר, פשוט תכתוב אותו בעצמך.

    יש גם מקרים שבהם יש רק קונסטרקטור ברירת מחדל (ראה מקרה LABEL בפורום דוט נט).

  12. אוריקס הגיב:

    חוצמזה
    הפתרון שלך לא יעבוד תמיד. הרעיון הוא שזה לא צריך להיות תלוי בכל סוג של positioning שהוא.
    ותוריד את ה standart mode, הפתרון עובד בלעדיו

    כמו שכבר אמנו – CSS 1.

  13. ניר טייב הגיב:

    גם ב-CSS 1 יש בוקס מודל
    רק בלי positions

  14. ניר טייב הגיב:

    הכי קרוב שאני מצליח עד עכשיו
    אני אולי מ-10 מחפש בגוגל אחר פתרונות ולא מצליח למצוא משהו שמתאים ל-CSS1. זה הדבר היחידי שהצלחתי לעשות לבד :-/

  15. ronklein הגיב:

    העברת data ל browser ע"י סקריפט
    אין לי ספק שאם באפליקציית הסרבר יוצרים קוד JS שיכיל את הנתונים – העניינים ירוצו יותר מהר (אצל הלקוח). אבל יש לי מספר הערות/הסתייגויות משיטה זו ובמיוחד כפי שהוצגה במאמר:
    1. שימוש ב delimiter עצמו בנתונים עלול להרוס את כל הסיפור. אם אחד הערכים מכיל למשל את הסימן ; אז אנחנו בבעיה.
    פתרון 1 – להשתמש ב delimiter _ממש_ נדיר. ולמרות זאת – לא ממליץ כטכניקה מספיק רצינית.
    פתרון 2 – המרת תוי ה delimiter (בשרת) למשהו אחר (כמו שניתן לרשום ב HTML את התוים <> ע"י קוד מיוחד).
    פתרון 3 – המרת כל ערך ל base64 ואז _בטוח_ שאין בו תוים כמו ";", "^" וכד'.
    שימו לב שפתרונות 2 ו 3 הם עדיין דורשים תכנות נוסף – ובשיטת ה XML אין צורך לבצע שום דבר.
    2. בשיטת XML בחרתם להשתמש ב ActiveXObject – שניתן להשתמש בו בעיקר (אם לא רק) ב MSIE. אם ככה – אז למה לא עד הסוף? באקספלורר יש VBScript, ושם אפשר לעבור על ה XML בלולאת For Each (אם אני זוכר נכון), שנחשבת יעילה יותר מלולאת For רגילה (לפחות ככה זה ב VB6).

    בסופו של דבר – המסר העיקרי שלי הוא: כן, עבודה עם XML נעשית בצורה איטית (יחסית), אבל היתרונות של XML רבים מאוד, ומאפשרים לבנות אפליקציה בצורה שניתן לתחזק אותה ולשנות אותה הרבה יותר טוב.

  16. אוריקס הגיב:

    עצה ידידותית
    תוריד topstyle, תגביל אותו ל CSS1 ותתחיל לשבור את הראש… גם אני צריך למצוא לזה זמן, אבל אין לי :-/

  17. יוסי ש הגיב:

    סליחה?
    אתה ממש לא חייב לדרוס את הconstructor שלך גם אם אין לך מה להכניס.
    אתה פשוט תירש את הconstuctor של מחלקת האב שלך..
    (אני לא רואה שום בעיה עם זה…)

  18. אוריקס הגיב:

    המממ
    שים לב, במאמר לא מדובר על הבעייה שהצגת אלא רק על השיטה עצמה.
    אתה בהחלט צודק שהבעייה קיימת וכמו שאתה ציינת אפשר גם להתמודד איתה.

    בנוסף, יש לי כמה הסתייגויות ממה שכתבת:
    1. גם ב JS יש לולאה דומה, קוראים לה for…in
    2. עבודה עם VBS היא תמיד לא מומלצת, דובר על זה רבות בפורומים השונים. זאת שפה שנופלת מ JS כמעט בכל פרמטר. תוכל לחפש מידע בפורום ASP בתפוז אם תרצה.
    3. ניתן בלי מאמצים רבים מידי להתאים את זה גם למוזילה, כל מה שצריך זה קצת browser detecting ויצירה קצת שונה של האובייקט.
    4. XML לא פותר את הבעייה שהצגת. אני מפנה אותך לפה, זהו קלאס שיוצר XML מהרקורסט. עכשיו, אם אחד השדות מכיל משהו כזה:


    </record>text

    אותה בעייה בדיוק קיימת, כשנעביר את ה XML ללקוח.

    בקיצור, דעתי היא שאחרי שכתבת את המודול שעושה את ההחלפות האילו, אין שום סיבה לא להשתמש בהעברה ללקוח בצורת מערכים.

  19. ניר טייב הגיב:

    קונסטרוקטור ברירת המחדל
    לא נורש משום מקום (להבנתי, גם לא מ-Object) הוא נוצר אוטומטית עם יצירת המחלקה במידה ואין שום בנאי אחר למחלקה, במידה ויצרת בנאי משלך למחלקה, בנאי ברירת המחדל מושמד.

  20. ronklein הגיב:

    לגבי הערה 4
    אתה בטוח בזה?
    עד כמה שאני זוכר, העבודה עם האובייקטים של ה XML מבטיחה שגם תוים "אסורים" כמו ">" מקודדים כך שהם לא מפריעים לפענוח של ה XML עצמו.

  21. ניר טייב הגיב:

    ועוד שאלת OOP
    מחלקה אמורה לייצג מבנה לוגי ולא לייצג פעולה מסויימת (כמו ש-JLabel  לא כותבת על המסך אלא מייצגת תווית). אז למה בחרת כאן להשתמש ביצירת אובייקט של מחלקה במקום לעשות את המתודה סטטית (static) ולקרוא לה בעת הצורך ?

    אם תסתכל על המחלקה Convert של .NET אתה תראה שהמתודות של ההמרה toInt31  ודומיו (ומצטער אם כתבתי את לא נכון ) הם סטטיות כי המחלקה לא אמורה לייצג שום דבר ולכן יש את הצורך להשתמש במחלקה כדי לאגד (encapsulate) את המתודות שצריך תחת גוף אחד.

    איני יודע בוודאות אם כתבתי נכון אבל אני מקווה שהרעיון מובן

    using System;
    using System.Data;
    using System.Data.OleDb;
    using System.Text;

    namespace DataHandler
    {
        public class TransferToClient
        {
            public static string GetString(OleDbCommand oCmd)
            {
                OleDbCommand oCommand = oCmd;
                StringBuilder oSB;
                OleDbDataReader oReader = oCommand.ExecuteReader();
                oSB = new StringBuilder();
                oSB.Append('[');
                while (oReader.Read())
                {
                    oSB.Append('[');
                    for (int j = 0; j < oReader.FieldCount; j++)
                    {
                        oSB.Append(""" + oReader.GetValue(j) + "",");
                    }

                    oSB.Remove(oSB.Length – 1, 1);
                    oSB.Append("],");
                }
                oSB.Remove(oSB.Length – 1, 1);
                oSB.Append(']');

                return oSB.ToString();
            }
        }
    }

    אני אשמח לשמוע את דעתך

  22. ניר טייב הגיב:

    Event Handler Class For JS…
    אני הוספתי אצלי מתודה שבאפליקציות DHTML נעזרים בה בדר"כ (במיוחד כאשר עובדים עם Positions של CSS)

    התכונה pageX שעובדת במוזילה וב-IE צריך ליצור אותה ע"י clientX+scrollLeft  (וכנ"ל ל-pageY)


    eventHandler.getDocPosition = function(e, coord){
        coord = (""+coord).toLowerCase();
        if("x"==coord){
            return e.pageX?e.pageX:e.clientX+document.body.scrollLeft;
        }else if("y"===coord){
            return e.pageY?e.pageY:e.clientY+document.body.scrollLeft;
        }else{
            return false;
        }
    }

    כמו כן הוספתי מתודה שתפקידה להסיר אירוע :

    eventHandler.removeEvent = function(oElement,sEventName,funRef){
        // Add by Nir Tayeb:
        if(eventHandler.iBrowser === 1){
            oElemen.detachEvent(type, funRef);
        }else{
            oElement.removeEventListener((""+sEventName).substring(2,sEventName.length),funRef,true);
        }
    }

  23. אוריקס הגיב:

    כי אתה מפספס את הרעיון…
    קודם כל, אין טעם כ"כ ביצירת מחלקה עם שיטות סטטיות אם אתה קורא לזה רק פעם אחת בעמוד (וכאן ברור שקוראים למחלקה הזאת רק פעם אחת בעמוד…).

    דבר שני, לשיטה סטטית, כידוע לך, אין גישה ל members הפנימיים של המחלקה (אלא אם כן הם סטטיים בעצמם) ואז אתה יוצר מצב שה OleDbCommand לא יכול להיות תכונה וזה מצב לא רצוי. זה בערך על אותו משקל של ההצעה שלך לא לאפשר לאתחל מחלקה עם ה default constructor שלה… זה לא בריא ולא נהוג. שוב, אין לך שום רצון להגביל את המשתמשים שלך .

    השיטה ToInt שהצגת סטטית כי אין לה קשר למופע ספציפי של המחלקה (כלומר int מסויים). דבר כזה יהיה לא לוגי בכלל:


    int x;
    int y = x.Parse(x);

    לעומת זאת דבר כזה יהיה הרבה יותר נכון:


    int x;
    int y = int.Parse(x);

    במקרה שלי אין את הבעייה הזאת, ואני כן רוצה להשתמש בתכונות פנימיות.

  24. אוריקס הגיב:

    אולי
    אבל לקליינט ה XML מועבר כסטרינג.

  25. ronklein הגיב:

    הכוונה שלי היא…
    הכוונה שלי היא שה XML שמועבר לקליינט "מקודד היטב". לדוגמה:
    אם ברשומה מסויימת יש את הערך:

    </record>my value

    אז בפועל ההמרה לסטרינג תהיה:

    </record>my value

    ואז הסטרינג שעובר לקליינט מפוענח היטב ע"י מנוע ה XML של הקליינט.
    כלומר, אין צורך ב delimiter בדרך הזו, ה structure נובע ישירות מה XML.

    יכול להיות שאני לא ברור, ועלי להודות גם שלא בדקתי עד הסוף את הדברים שאני אומר, אבל אני די בטוח שככה זה עובד (יפתיע אותי אם לא).

    אשמח לשמוע תגובתך בעניין. כמובן – גם כל האחרים מוזמנים להגיב

  26. ronklein הגיב:

    נדפק קלות…
    צריך להיות:
    אז בפועל ההמרה לסטרינג תהיה:

    [Ampersand]lt[semi-colon]/record[Ampersand]gt[semi-colon]my value

  27. אוריקס הגיב:

    ניר,
    מהקובץ שצרפת נראה שלא ממש הבנת את האתגר. קודם כל, לא מדובר על VALIGN שהוא TOP, MIDDLE או BUTTOM, אלא על VALIGN באחוזים. כלומר, אני יכול לתת לו למשל 30%.

    דבר שני, הפתרון שלך לא עובד תמיד. אתה צריך להגיע למצב שללא תלות בגודל אלמנט האב וללא תלות בגודל האלמנט שאתה רוצה לעשות לו VALIGN זה יעבוד. אם אני אשנה את הגודל של אחת מהקופסאות שצרפת בקובץ זה לא יעבוד. פתרון פרטי זו לא חוכמה למצוא ואת זה אפשר לעשות גם בלי סיבוכים מיותרים… השאלה היא איך אתה מטפל במקרה הכללי.

  28. אוריקס הגיב:

    וכמובן שגם ללא תלות
    ב MARGINים, PADDINGים וחבריהם.

  29. ניר טייב הגיב:

    אתם בטוחים שזה בכלל אפשרי ?
    CSS1 לא נותן לך הרבה אפשרויות,
    vertical-align  עובד על טקסט ביחס לטקסט שלידו (ועם תמונות)
    margin, padding נותנים את הפאשרות למקם אלמנטים/קופסאות/טקסט ביחס לאלמנט האב

    מעבר לשלושת תכונות אלו ו-Line-height שלא עוזר ממש ,אין שום דרך אחרת לעשות את הדברים הללו.

    לעומת זאת ב-CSS 2 כבר מצאתי מס' אפשרויות יפות למימוש של זה…

    טוב שאני אמצא לאתר שוב זמן, אני אעבוד על זה…

  30. ניר טייב הגיב:

    אולי …
    רוב הסיכויים שזה לא התקבל אבל אם כבר :-/

  31. ניר טייב הגיב:

    ויש גם את זה
    וגם את לא נראה לי שתקבלו :-/

  32. אוריקס הגיב:

    אפשרי
    זה אתגר קשה אנחנו יודעים

    בכל מקרה אין טעם להעלות סתם קבצים, אם יהיה לך פתרון כללי תעלה אותו

  33. אוריקס הגיב:

    לא,
    ה XML מועבר לקליינט כסטרינג לכל דבר, גם אם בפועל הוא נוצר באמצעות XML DOM…
    זה כמו שאם הייתי יכול להעביר מערך כמערך, כלומר משהו כזה:


    <%
    var a = [1,2,3];
    %>
    <script>
    var arr = <%=a%>;
    </script>

    אז אותה בעייה לא הייתה קיימת… הבעייה מתחילה כשזה מועבר כסטרינג טיפש.
    אם אתה רוצה עדיין להשתמש בשיטה שלך יש אפשרות ליצור דף ASP שהפלט שלו הוא XML (ולא סטרינג) ואז לעבוד רגיל ובלי תחכומים מיותרים. החסרון הוא שזה יחייב אותך לשתי בקשות.

  34. ניר טייב הגיב:

    שים לב רק שבעמוד השני
    שהעלתי בסה"כ צריך לשנות את גודל הפונט ואת הגובה של האלמנט שהם יהיו שווים ואז אפשר להתחיל להשתמש ב-Line-height  עם אחוזים כך שיהיה אותו אפקט של valign.

    כי בעצם line-height מושפע מגודל הפונט.

    טוב נראה מה אני עוד יכול לעשות

  35. ronklein הגיב:

    תגובה
    אני מבין שהבעיה מתחילה כאשר רוצים להעביר סטרינג טיפש.
    השאלה שלי היתה האם ה XML DOM מצליח ליצור סטרינג שהוא גם טיפש וגם מחוסן בפני תוים בעייתיים, כך שההמרה שלו אח"כ בחזרה XML Document על הקליינט עוברת חלק.
    אם כן – אז מה שאמרתי קודם – עדיין תקף: מבנה ה XML עובר אוטומטית עם ההמרה עצמה, ובשיטה השניה יש לעבוד עם delimiter ולהתאמץ קצת עד שמגיעים לתוצאה שקולה.
    אם יהיה לי זמן – אני אנסה את זה בעצמי ואשתף את הפורום.

  36. אוריקס הגיב:

    שום דבר לא אמור להיות מושפע משום
    דבר. זה אמור לעבוד תמיד, וזה בדיוק הקושי פה

  37. אוריקס הגיב:

    האמת שאתה צודק
    המנוע הופך תווים בעיתיים כמו > ו <, ולכן הבעייה לא קיימת. למרות שזה יכול להפוך לבעייתי כשאני כן רוצה את התווים האילו לא בתוך HTML כמו במקרים כאילו למשל:


    <input type = "text" value = "כאן בא ערך מה XML">

    בכל מקרה אני עדיין חושב שאין שום סיבה לספוג את ה overhead הכרוך ביצירת ה XML הזה ולעבוד בצורה חכמה עם GetString

  38. ניר טייב הגיב:

    עדכון אבטחה ל-FireFox
    http://www.getfirefox.com

    תוקנו מס' בעיות אבטחה ב-FF.

שלח תשובה