שלח תשובה

זירת השאלות

463
צפיות
27
תשובות

בעיה ב=JS

,‏ 13 באוגוסט, 2004

שלום לכולם!
בניתי פונק' ב-JS שלוקחת ערכים משדה טקסט ומחפשת שורות עם סימן סולמית.(#)
היא אמורה להחליף אוטומטית שורות עם סימן הנ"ל לשורות ממוספרות…
בתיאוריה של הפונק' הכל טוב ויפה(אני מקווה) אבל בפועל יש בעיה בשורה האדומה.
הודעה השגיאה במוזילה היא:

Error: data[i – 1] has no properties

וב-IE:

Error: 'undefined' is null or not an object

והנה הפונק':

function f1()
{
var txt = document.frm.txt.value
var data = txt.split("n")

    for(i=0; i < data.length; i++)
        {
            if(data[i].charAt(0)=='#')
                {
                data[i] = data[i].replace("#","<li>")
                data[i] += "</li>"
                if(data[i-1].charAt(0)!='#'){data[i] = "<ol type="1">" + data[i]}
                if(data[i+1].charAt(0)!='#'){data[i] += "</ol>"}

                alert(data[i])
                }
        }
}



תודה לכל העוזרים,
אלברט

תגיות:

27 תשובות

  1. BuildHome הגיב:

    אתה יכול
    להשתמש עם indexOf ולעשות ריפלייקס לכל ערך השדה כמו שצריך.

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

    כמה דברים
    1. ריפלייס ב-JS צריך לקבל REGEXP בפרמטר הראשון (ע"פ התחביר שלו) לכן כך יהיה הריפלייס:

    data[i] = data[i].replace(/#/,"<li>")

    2. הריפלייס הזה יחליף רק את ה-# הראשונה שהוא ימצא כי לא הוגדר GLOBAL ב-REGEXP
    3. אם אתה עושה ריפלייס עם גלובל או בלעדיו אז אם התו הראשון יהיה # הוא יוחלף על בטוח. לכן אין מצב שהוא יהיה בתחילת השורה

    4. (אחרון חביב) האינדקס הראשון במקרה הזה של המערך הוא 0 ולכן באיטרציה הראשונה שאתה עושה הוא לא מוצא את data[i-1] כי זה בעצם מחזיר data[-1] והאיבר הזה לא קיים במערך ולכן אתה מקבל את השגיאה.

    נ.ב רצוי להיצמד לERORRים של מוזילה הם יותר מפורטים

  3. albert הגיב:

    לא ממש הבנתי
    קודם כל תודה!
    שנית, לא הבנתי את הנקודות 1,2,3
    תסביר לי בבקשה שוב….
    מה זה REGEXP?
    מה זה BLOBAL?

    תודה,
    אלברט

  4. albert הגיב:

    קראתי
    קראתי את המאמר אבל לא ממש הבנתי איך זה אמור להיות קשור לפונק' שלי…?
    הפונק' שלי אמורה לעשות כזה דבר:
    במקום:
    # א
    # ב
    # ג

    ככה:
        1. א
        2. ב
        3. ג

    כלומר להחליף את סדרת הסולמיות לקוד הבא:

    <ol type="1">
    <li>א</li>
    <li>ב</li>
    <li>ג</li>
    </ol>

    את כל תגי ה- <li></li> אין בעיה לסדר…
    פשוט מחליפים את הסימן # סולמית ל <li>, ואפשר להריץ לולאה על המערך ולהסויף לכל שורה את התג- </li>…
    אבל השאלה איך מוסיפים את התג של הרשימה <ol type="1"></ol>?
    כי אם לא נוסיף את זה, הרשומה לא תהיה ממוספרת, אלא היא תהיה מנוקדת…

    תודה לכל העוזרים,
    אלברט

  5. albert הגיב:

    שאלה נוספת:
    מה הבדך בין r ל- n?

    תודה,
    אלברט

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

    n זה שורה חדשה
    ו-r זה  Curriage return  (לחצן האנטר ע"פ הבבילון P-:)

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

    הקשר הוא
    שאתה עושה ריפלייס ב-JS והפרמטר הראשון של ריפלייס ב-JS הוא אובייקט REGEXP – עכשיו זה מובן ?

  8. albert הגיב:

    אבל מה ההבדל בשדה טקסט(textarea)?
    כי כשאני עושה split לשדה טקסט עם r אני מקבל את גודל המערך תמיד 1 גם כשיש 10 שורות(אני לא מצליח להבין למה) וכשאני עושה עם n אני מקבל את גודל המערך כגודל השורות…
    אפשר קצת הסבר?

    תודה,
    אלברט

  9. albert הגיב:

    שאלה נוספת
    שוב בנושא ה- regExp:
    איך מגדירים את האובייקט כרב שורתי?

    תןדה,
    אלברט

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

    בשני אפשרויות
    א. בעת יצירת האובייקט:

    var rExp = /pattern/m;
    var rExp1 = new RegExp("pattern","m");

    ה-m מסמל multiline

    ב. ע"י נתינת TRUE למאפיין ה-multiline

    var rExp = /pattern/
    rExp.multiline=true

  11. albert הגיב:

    תודה רבה! ועוד משהו קטן:
    למה ה-replace הזה לא עובד במוזילה וכן עובהד ב-IE?

    rs = rs.replace(/^—+/gm,"<hr>")

    ואין שום הודעת שגיאה….

    תודה,
    אלברט

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

    נסה לעשות ריפלייס כזה:


    tText = tText.replace(/rn/g,"<br />")

    (אם זה לא עובד אז נסה להפוך את ה-rn ל-nr)

  13. albert הגיב:

    עוד שאלה
    כמובן עדיין בנושא ה- regExp…
    יש לי את ה- replace הזה:

    rs = rs.replace(/[s](http://[S]+)/gi," <a href="$1" target="_blank">$1</a>")

    אבל הבעיה היא שאחרי קישור, השורות שהבאות לפניו  ואחריו, הופכות לשורה אחת…
    כלומר:

    a
    b
    c
    http://www.google.com

    d
    e
    f

    הופך ל:

    abc http://www.google.com def

    מה הבעיה? ואיך מסדרים את זה?

    תודה,
    אלברט

  14. albert הגיב:

    הבעיה רק במוזילה…..
    וגם הריפלייס הקודם לא עובד במוזילה

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

    ד"א
    לדעתי יהיה יותר נכון לכתוב כך את ה-regExp שלך

    (/[s]b(http://[S]+)b/gi

    ובכך לוודא שהכתובת ניתנה בניפרד ולא כחלק ממילה כמו: "ה-HTTP// מסמל…"

  16. albert הגיב:

    תודה אבל עשיתי ככה:

    /((http://[S]+))/gi

    אני חושב שזה טוב…

    שוב תודה על העזרה

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

    על לא דבר
    ואם הבנתי אותך אז כדי שהמשתמש ישים קישורים הוא יצטרך להקיף את הכתובת בסוגריים.

  18. albert הגיב:

    נכון…
    כי יש מצב שאולי הוא לא רוצה שהכתובת תהפוך לקישור… אי אפשר להכריח אותו…
    אם הוא רוצה קישור הוא יצטרך לשים בסוגריים…

שלח תשובה