DCSIMG
|Add onclick function(with parameters) using java script - שלמה גולדברג (הרב דוטנט)
Sign in | Join | Help

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

|Add onclick function(with parameters) using java script

פורסם בתאריך Mar 03 2009, 08:37 PM על ידי Shlomo | ישנם 16 תגובות

 

נתקלתי היום בבעייה מעצבנת ב java script.
 
האמת זה לא פייר להגיד שהבעייה הזאת מעצבנת, כי כל הבעיות ב java script מעצבנות. (אבל זאת במיוחד).
 
הפוסט הזה ודוגמאות הקוד נכתבו בעזרתו של אחי, יוסי גולדברג.
 
הייתי צריך להוסיף ב RunTime שורות לטבלה. ולהוסיף onclick על ה td,
 
נשמע פשוט, לא ?
 
 
נראה בהתחלה את הקוד של הוספת השורות. (יש כמה דרכים, אני בחרתי באחת מהם)
 

    1 function createAtRunTime() {

    2     var table = document.getElementById('tbl').

    3             getElementsByTagName("TBODY")[0];

    4 

    5     for (var i = 0; i < 5; i++) {

    6         var row = document.createElement("TR")

    7         var cell = document.createElement("TD")

    8 

    9         cell.appendChild(document.createTextNode('shlomo goldberg'));

   10 

   11         row.appendChild(cell);

   12         table.appendChild(row);

   13     }

   14 }

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

    1   cell.attachEvent("onclick", ShowMsg);

 

    2 function ShowMsg() {

    3     alert("Msg");

    4 }

 
או להשתמש עם setAttribute (תואם לכל הדפדפנים), בצורה הבאה:
 

    5  cell.setAttribute("onclick", function() { ShowMsg() });

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

    1   cell.setAttribute("onclick", function() { ShowMsg(i) });

 

    2 function ShowMsg(msg) {

    3     alert(msg);

    4 }

 
כל חמש העמודות כשילחצו עליהם יציגו את המספר 5.
 
והסיבה היא פשוטה.
 
שורה מספר אחד, מייצרת מתודה אנונימית, בכל פעם שאני משנה את הערך של i בתוך הקריאה אני למעשה משנה את אותו עותק של המתודה האנונימית,
כשלבסוף נשאר לי מתודה שמתיגה את המספר 5.
 
למעשה אפשר לתרגם את שורה מס' 1, ל
 
 

    1   var newFunc = function myFunc() { ShowMsg(i); };

    2   cell.setAttribute("onclick", newFunc);

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

    1   cell.setAttribute("msg", i);

    2   cell.setAttribute("onclick", ShowMsg);

 

    3 function ShowMsg() {

    4     alert(event.srcElement.msg);

    5 }

 
הרי אני יכול להוסיף כל attribute שעולה על דעתי ולתת איזה ערך שאני רוצה.
 
אז אני מוסיף attribute שנקרא msg, ונותן לו את ההודעה שאני רוצה להציג למשתמש בזמן לחיצה, (בדוגמא את הערך של i)
והפונקצייה תיקח ממי שקרא לה את הערך מתוך ה attribute.
 
הנה הקוד המלא:
 

    1 function createAtRunTime() {

    2     var table = document.getElementById('tbl').

    3             getElementsByTagName("TBODY")[0];

    4 

    5     for (var i = 0; i < 5; i++) {

    6         var row = document.createElement("TR")

    7         var cell = document.createElement("TD")

    8 

    9         cell.setAttribute("msg", i);

   10         cell.setAttribute("onclick", ShowMsg);

   11         cell.appendChild(document.createTextNode('shlomo goldberg'));

   12 

   13         row.appendChild(cell);

   14         table.appendChild(row);

   15     }

   16 }

   17 

   18 function ShowMsg() {

   19     alert(event.srcElement.msg);

   20 }

רשימת תגובות

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Tuesday, March 03, 2009 11:12 PM על ידי עומר ון קלוטן  

רק הערה קטנה: TR ו-TD לא יוצרים עם createElement אלא עם insertRow ו-insertCell, אחרת יש בעיות בחלק מהדפדפנים.

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Wednesday, March 04, 2009 12:14 PM על ידי linqed  

תודה על ההשראה.

הנה איך ניתן להשיג את אותו הדבר ויותר בעזרת jQuery:

blogs.microsoft.co.il/.../generating-html-tables-with-jquery.aspx

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Wednesday, March 04, 2009 1:53 PM על ידי danielisimo  

עוד צורה להגיע ל I

cell.setAttribute("onclick", "ShowMsg("+i+")" );

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Wednesday, March 04, 2009 3:20 PM על ידי Shlomo  

בטוח שזה עובד ?

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Wednesday, March 04, 2009 4:32 PM על ידי Rotem Bloom  

שלמה הדרך הטובה והפשוטה ביותר היא להשתמש באובייקט של JS שנקרא FUNCTION בצורה הבאה:

cell.onclick = new Function("ShowMsg(" + i + ")");

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Wednesday, March 04, 2009 4:48 PM על ידי Rotem Bloom  

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

אחלה של השוואות בן השיטות ניתן למצוא פה:

www.quirksmode.org/.../innerhtml.html

דוגמא למאמר טוב בנושא ניתן למצוא פה:

www.oreillynet.com/.../dannygoodman.html

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Wednesday, March 04, 2009 4:49 PM על ידי Shlomo  

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

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Wednesday, March 04, 2009 5:08 PM על ידי Rotem Bloom  

שלמה לא בדקת נכון כי עם NEW FUNCTION כמו שכתבתי לך זה יעבוד לך באחריות.

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Wednesday, March 04, 2009 8:12 PM על ידי Shlomo  

כל הכבוד, צודק בהחלט, עם new Function, זה עובד.

אני מניח שזה גורם לייצר כל פעם מתודה אנונימית אחרת.

תודה רבה

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Wednesday, March 04, 2009 8:56 PM על ידי Ella Maschiach  

מגניב! תודה רבה לכל התורמים :)

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Thursday, March 05, 2009 1:43 PM על ידי shachar  

מותר לשאול למה אתה מוסיף שורות לטבלה בצורה כזו?

אולי יש רעיון טוב יותר לבצע את מה שאתה רוצה?

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Thursday, March 05, 2009 2:03 PM על ידי Shlomo  

בהחלט מותר.

אני רוצה להביא חדשות האתר, בצורה דינמית.

אני ניגש עם xmlhttp דרך js ל web service.

מביא את הנתונים ב json,

ואני אמור להכניס לטבלה.

עבור כל חדשה אני מייצר שורה. וכשלוחצים על זה, אני רוצה להציג div (או לפתוח חלון אחר) ולהציג את החדשה המלאה.

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Tuesday, March 10, 2009 10:36 AM על ידי משה  

למה לא פשוט

td.onclick = function (e) {...}

ואם זה מסתבך אז

function a (id) {return function(){showMsg(id)}; }

td.onclick = a(1);

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Tuesday, March 10, 2009 4:48 PM על ידי Shlomo  

כבר דברנו על זה בתגובות, עם לא עושים כמו שרותם הראה לנו, עם new Function, או כמו שכתבתי עם ה attribute, הקוד שאתה מציע, יראה את אותה הודעה לכל ה td, תנסה בעצמך.

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Tuesday, October 06, 2009 3:26 PM על ידי רון כהן  

שלמה היקר.

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

cell.onclick = function()

{

ShowMsg(this.msg);

}

כמובן בתנאי שאתה עדיין מוסיף Attribute msg לכל cell;

# re: |Add onclick function(with parameters) using java script

פורסם בתאריך Thursday, April 15, 2010 12:13 PM על ידי נחום טפר  

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

varName=new Function([param1Name, param2Name,...paramNName], functionBody);

שראיתי בלינק הבא:

www.permadi.com/.../index.html

למשל:

for (var i=0;i<last;i++)

{

 var x=document.getElementById('myColumn'+i);var newimg=document.createElement('img');newimg.src='/OA_MEDIA/myImage.gif';newimg.alt='my image alt';newimg.onclick=new Function('myColumn'+i,'alert('+i+');');x.appendChild(newimg);

}

בהצלחה

שלח תגובה

(שדה חובה) 
(שדה חובה) 
(אופציונלי)
(שדה חובה) 

Enter the numbers above: