שלח תשובה

זירת השאלות

424
צפיות
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 הגיב:

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

שלח תשובה

חדש! אחסון אתרים של וובמאסטר

שירות אחסון אתרים
המקצועי של וובמאסטר!

מומחים באירוח אתרי
WordPress, Joomla, Drupal

  • שרתי לינוקס עם CloudLinux, LiteSpeed
  • 1GB דיסק SSD, 10GB תעבורה חודשית
  • ממשק ניהול cPanel, תעודת SSL חינם

עכשיו במחיר היכרות:
רק 420 ש"ח לשנה!