DCSIMG
March 2009 - Posts - שלמה גולדברג (הרב דוטנט)

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

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

March 2009 - Posts

Rasie events in static constractor ?

 

האם יש משמעות להרים events בתוך static cror ?
 
התשובה היא, לא!
 
מכיון שאין שוב מצב שמישהו יקבל את ההודעה שהאירוע התרחש,
 
בגלל ההנחות הבאות:
 
1. מתוך static ctor, אפשר לגשת אך ורק ל static events.
 
2. ה static ctor, יתרחש תמיד שנייה לפני השימוש הראשון ב static של ה class
 
3. ניסיון של רישום ל static events, יגרום להפעלת ה static ctor.
 
4. הרישום לאירוע, לא יקלט לפני סיום ה ctor.
 
ולכן אף פעם לא נוכל להרים אירוע מתוך ה static ctor.
 
 
הפיתרון היחיד שמצאתי היה, שמיד אחרי הרישום לאירוע הפעלתי בעצמי את המתודה, לדוגמא:
 

StaticClass.StaticEvent += StaticClass_StaticEvent;

StaticClass_StaticEvent(null, null);

 
אם למישהו יש רעיון יותר טוב, אשמח לשמוע על זה.
Posted: Mar 27 2009, 09:05 AM by Shlomo | with 5 comment(s)
תגים:, ,

Untitled Page - ניסוי קטן ומעניין

 

אתם זוכרים תמיד לתת כותרת לדפים שלכם, לפני שאתם מעילם את האתר לשרת ?
 
תלחצו על הלינק הבא (חיפוש בגוגל את המילים Untitled Page)
 
תופתעו לגלות כמה תוצאות יש.
 
http://www.google.com/search?hl=en&num=100&q=%22Untitled+Page%22
 
 
הקרדיט מגיע לליקוטי שיבולים
 
Posted: Mar 24 2009, 12:02 AM by Shlomo | with 2 comment(s)
תגים:

Resource in javascript using HttpHandler

 

אז כתבנו Resource file, והכנסנו לתוכו את כל ההודעות שלנו,
 
ואפילו הגדרנו אותו כ public, כדי שנוכל לגשת אליו מכל הפרויקטים,
 
אבל מה אנחנו עושים, עם ההודעות שאנחנו רוצים להציג ב JavaScript,
 
 
אז הנה הפיתרון:
 
בפרויקט שאפשר להוריד מכאן:
 
יש פרויקט שנקרא Common, שבו יש את ה resource file,
 
הוספנו בפרויקט ה web, קובץ מסוג HttpHandler,
 
שקורא את כל המאפיינים של ה Resource, ומחזיר מערך JS, עם כל הערכים.
 
הנה הקוד:
 
 

    1 public void ProcessRequest(HttpContext context)

    2 {

    3     context.Response.ContentType = "application/js";

    4 

    5     // Get the type of the resource class

    6     Type messagesType = typeof(Messages);

    7 

    8     // Get the all properties taht is public and static

    9     PropertyInfo[] properties = messagesType.GetProperties(

   10             BindingFlags.Public | BindingFlags.Static);

   11 

   12     // Get a collection of Pair,

   13     // the first is the property name, and the secound is the property value

   14     var stringProperties =

   15         from property in properties

   16        where property.PropertyType == typeof(string)

   17        select new Pair(property.Name, property.GetValue(null, null));

   18 

   19 

   20     // Build the javascript array

   21     StringBuilder bulder = new StringBuilder();

   22     bulder.Append("var messageArray = new Array(); ");

   23 

   24     foreach (var item in stringProperties)

   25     {

   26         bulder.Append(string.Format("messageArray['{0}'] = '{1}'; ",

   27                                     item.First, item.Second));

   28     }

   29 

   30     context.Response.Write(bulder.ToString());

   31 }

 
 
אז מה כתוב בקוד:
 
שורה 3: הגדירה שמה שחוזר הוא מסוג JavaScript
 
שורה 6: קבלת ה Type של Messages (קובץ ה Resource)
 
שורה 9: קבלת כל המאפיינים שמוגדרים כ: public static
 
שורה 14 - 17: קבלת Collection של Pair, שמכיל את השם של המאפיין, ואת ערכו. (null, null בשורה 17, זה בגלל שהמאפיין הוא סטטי, ולא indexer)
 
שורה 21: הגדרת ה StringBuilder, שיכיל את המערך ה JS.
 
שורה 22: הגדרת המערך ב JS.
 
שורה 24 - 28: ריצה על כל המאפיינים שקבלנו, ולהוסיף אותם למערך.
 
שורה 30: כתיבה של המערך ל Response.
 
 
השימוש בצד ה Web, יהיה פשוט:
 
 

    1 <script src="MessageHandler.ashx" type="text/javascript"></script>

    2 <script type="text/javascript">

    3     function Show() {

    4         alert(messageArray['Name']);

    5         alert(messageArray['Address']);

    6     }

    7 </script>

 
 
ייבוא של ה JS, מתוך ה httpHandler.
 
ואז פשוט להשתמש במערך.
 
 
תהנו

הצמדת שני td משני tr, כדי שלא יהיה רווח, באמצעות vertical-align

 

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

    1 <table>

    2     <tr>

    3         <td>

    4             <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />

    5         </td>

    6     </tr>

    7     <tr>

    8         <td>

    9             <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />

   10         </td>

   11     </tr>

   12 </table>

 
זה הביא לי את התוצאה הבאה:
 
ואז כמובן שניסיתי להוסיף cellpading=0 cellspacing=0,
 

    1 <table cellpadding="0" cellspacing="0">

    2     <tr>

    3         <td>

    4             <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />

    5         </td>

    6     </tr>

    7     <tr>

    8         <td>

    9             <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />

   10         </td>

   11     </tr>

   12 </table>

 
 
זה לא עזר, זה אמנם קירב קצת, אבל התוצאה הייתה נראת כך:
 
האופצייה הבאה שלי, הייתה להשתמש ב background של התמונה לעמודה, במקום אובייקט תמונה,
ואז יחד עם ה cellpading ו cellspacing, זה עבד.
 
 

    1 <table cellpadding="0" cellspacing="0">

    2     <tr>

    3         <td style="background-image:

    4                 url(http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx);

    5             width:128px; height:58px;">

    6             &nbsp;

    7         </td>

    8     </tr>

    9     <tr>

   10         <td style="background-image:

   11             url(http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx);

   12             width:128px; height:58px;">

   13             &nbsp;

   14         </td>

   15     </tr>

   16 </table>

 

 
 
 
וכמובן שזה עבד רק בתוספת של cellpadding="0" cellspacing="0"
 
הבעייה שלי הייתה שעל התמונה שלי (באתר של סלע) מופיע כיתוב של "לסיור וירטואלי", שאמור להיות לינק.
 
והאופצייה היחידה שעמדה לרשותי, היה, להשתמש ב image map,
הבעייה כמובן, שברגע שהתמונה היא, background, אי אפשר לצרף לה imgae map,
 
ומצד שני, לא הצלחתי למצוא איך לגרום לתמונות להיות רצופות.
 
ניסתי לעשות ל td העליון valign=butoom, ולתחתון valign=top,
לא עזר, בין השורות היה רווח.
 
בסופו של דבר אמר לי מישהו עם הרבה נסיון ב html, שאני אנסה לתת valign לתמונה בעצמה:
 
 

    1 <table cellpadding="0" cellspacing="0">

    2     <tr>

    3         <td>

    4             <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx"

    5             style="vertical-align:bottom" />

    6         </td>

    7     </tr>

    8     <tr>

    9         <td>

   10             <img src="http://blogs.microsoft.co.il/photos/shlomo/images/248506/original.aspx" />

   11         </td>

   12     </tr>

   13 </table>

 

 

 
וכבמעשה ניסים, זה עבד.
Posted: Mar 14 2009, 10:08 PM by Shlomo | with 7 comment(s)
תגים:, , ,

יצירת Dynamic Web Slices בפחות מחמש דקות (פיצ'ר מקסים של IE8)

 

כבר כתבתי בעבר על IE8,
שאני אוהב אותו, ומחכה שהוא ייצא בגרסה רשמית,
 
אמנם כתבתי, שאני לא מתכוון לעבור אליו, בגלל שאני לא יכול להחזיק גרסאות אחרות במקביל, יש אמנם את הפתרון של רותם,
אבל , זה לא כולל את IE7,
 
בכל מקרה, רציתי להציג את אחד מהדברים היותר נחמדים שקיים ב IE8, (ממש התלהבתי מזה).
 
אנחנו מדברים על: Dynamic Web Slices.
 
הרעיון לפוסט הגיע מהבלוג הרשמי של IE8,  תוכלו לקרוא שם הרבה יותר, מאשר כאן,
 
אני רוצה להציג בקצרה מה אפשר לעשות, ואיך, בפוסט שם יש מעבר על כל המאפיינים של ה  Dynamic Web Slices.
 
 
לפני שנראה קוד, בואו נראה תוצאה:
WebSliceDemo
 
 
אנחנו רואים, WebSlice, שמציג את השער היציג של המטבעות , ישר מבנק ישראל.
 
נחמד, לא ?,
 
כל פעם שאני רוצה לראות את השער היציג של מטבע מסוים, אני לוחץ על הלחצן, ורואה, מבלי צורך לגלוש לאתר של בנק ישראל.
 
אז איך עושים את זה ?
 
 
דבר ראשון כמובן שאתם צריכים לייצר את הדף שאתם רוצים, שהוא יהיה התוכן של ה WebSlice,
בדוגמא שלנו, יצרתי דף שמתחבר לבנק ישראל, מוריד קובץ xml, שמכיל את שערי המטבע, ומציג את התוצאות בגריד.
 
תוכלו להוריד את כל הפרויקט מכאן:
 
כעת אחר שיצרנו את הדף,
נכתוב את הקוד שגורם לו להיות מוצג כ WebSlice.
 
הנה:
 

    1 <div class="hslice" id="slCurrency">

    2     <span class="entry-title">Currencies</span>

    3     <a rel="entry-content" href="http://localhost:1731/Default.aspx"

    4         style="display: none;"></a>

    5     <span class="entry-content">Add the Currencies Slice</span>

    6     <span class="ttl" style="display: none;">15</span>

    7     <a rel="bookmark" href="http://localhost:1731/Default.aspx"

    8         style="display: none;"></a>

    9 </div>

 
 
ה class=hslice, גורם ל IE, להבין שה div הוא WebSlice,
וכשתעמדו עם העכבר על ה div, הוא יציע לגולש להוסיף את התוכן כ WebSlice.
 
צריך לתת Id, ל div.
 
ה  span, שמכיל את הclass של entry-titke, יהיה הכותרת של ה WebSlice.
 
ה ttl, מגדיר כל כמה שמן זה יתרפרש (ניתן לשינוי על ידי המשתמש) 
 
וה a של entry-content, יחיל את הלינק להיכן נמצא התוכן שאמור להיות מוצג.
 
ה span הבא אחריו, הוא תוכן כלשהו, (לא ב WebSlice - אלא בדף שבו נמצא הלינק להוספת ה Slice)
 
WebSlice2
 
הלינק שמוגדר כ bookmark, הוא מה שמוצג בשורה התחתונה ב WebSlice,
תוכלו לקבוע שם url שונה  מה url של ה slice, שהגולש יוכל ללחוץ עליו.
 
שימו לב שגודל ברירת מחדל של ה Slice, הוא: 320 על 240.
 
אני לא אאריך מעבר לכך, אבל אני ממליץ לכם לעבור על הפוסט שמסביר בפירוט על הנושא.
 
 
 
דרך אגב, הייתי חייב להתקין את IE8, עבור הפוסט הזה, וגילית באג נחמד בו.
ככה מדי פעם, כשאני כותב את הפוסט, כל התוכן מחליט להעלם, ורק אם אני משחק עם הגודל של תיבת הטקסט, (ע"י החץ מצד ימין של העורך)
אני רואה החזרה את התוכן.

Web Service -> JSON -> JavaScript. קל פשוט ונהדר

 

מיום ליום אני מתעצבן פחות על ה java script, ואני מגלה עוד דברים נהדרים שאפשר לעשות איתו.
 
כאן אני רוצה להראות, עד כמה זה פשוט מ JavaScript לפנות ל Web Service, לקבל מידע ב JSON, ולעבוד איתו.
 
שלב ראשון, נכתוב WebService.
 
 

    1 public class Student

    2 {

    3     public string Name { get; set; }

    4     public string Address { get; set; }

    5     public string Phone { get; set; }

    6     public int Age { get; set; }

    7 }

 

 

    8     [WebService(Namespace = "http://tempuri.org/")]

    9     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

   10     [ToolboxItem(false)]

   11     [ScriptService]

   12     public class JsonWebService : WebService

   13     {

   14 

   15         [WebMethod]

   16         public Student[] GetAllStudent()

   17         {

   18             return new Student[]

   19             {

   20                 new Student(){ Name = "Shlomo",

   21                                Age = 24,

   22                                Phone = "123456",

   23                                Address = "Elad"},

   24 

   25                 new Student(){ Name = "Yossi",

   26                                Age = 23,

   27                                Phone = "543256",

   28                                Address = "Beni brak"},

   29 

   30                 new Student(){ Name = "Tomer",

   31                                Age = 30,

   32                                Phone = "0000000",

   33                                Address = "Tel Aviv"}

   34             };

   35         }

   36     }

   37 }

 
הגדרנו class כלשהו, ואנחנו מחזירים מערך שלו במתודה של web service.
 
כעת נכתוב מתודה ב JavaScript, שיודעת לפנות לשרת ולהחזיר JSON, (במחרוזת)
 
את הקוד הבא העתקתי (עם קצת שינויים) מכאן:
 
 

   38 function GetSynchronousJSONResponse(url, postData) {

   39     var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

   40 

   41     //false means synchronous

   42     xmlhttp.open("POST", url, false);

   43     xmlhttp.setRequestHeader("Content-Type",

   44             "application/json; charset=utf-8");

   45 

   46     xmlhttp.send(postData);

   47     var responseText = xmlhttp.responseText;

   48     return responseText;

   49 }

 
המתודה מקבלת url של web Service + web method, ו postData שזה פרמטרים עבור המתודה.
 
מייצרים אובייקט של xmlhttp,
 
מגדירים את כל ההגדרות, ומצפים לתשובה.
 
כעת נראה את הקריאה למתודה.
 

   50 function GetData() {

   51     var url = 'http://localhost/jsondemp/JsonWebService.asmx/GetAllStudent';

   52     var result = GetSynchronousJSONResponse(url, null);

   53 

   54 }

 
 
במידה ונעשה alert למה שחוזר, נראה את הדבר הבא:
 
Json Alert
 
 
כעת מה שנשאר, זה להפוך את המחרוזת הזאת לאובייקט JSON, שאפשר לעבוד איתו.
 
נכתוב את הקוד הבא:
 
 

   55 function GetData() {

   56     var url = 'http://localhost/jsondemp/JsonWebService.asmx/GetAllStudent';

   57     var result = GetSynchronousJSONResponse(url, null);

   58     //alert(result);

   59     result = eval('(' + result + ')');

   60 

   61     for (var i = 0; i < result.d.length; i++) {

   62         var person = result.d[i];

   63 

   64         var name = person.Name;

   65         var phone = person.Phone;

   66 

   67 

   68     }

   69 }

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

Cancel the CAPTCHA - או לכתוב תגובות גם כשפתחתם כמה פוסטים במקביל

 

הבעייה ידועה, אם פתחתם יותר מפוסט אחד במקביל, תוכלו להגיב רק לאחרון, או שתרפרשו את הדף.
 
כתבתי בעבר פוסט שמסביר למה זה קורה, כאן.
 
 
למה נזכרתי עכשיו ?
 
כי שמעתי מאבי, שהוא רצה להגיב לי, אבל ה CAPTCHA שוב תקע אותו,
ואז אמרתי לעצמי, שאם אני לא מקבל תגובות בגלל זה, אני חייב לפטור את הבעייה.
 
אז כתבתי AddIn ל IE, שיעיף את הבדיקה המעצבנת.
 
כבר כתבי בעבר AddIn עבור כותבי הפוסטים בעברית, כדי לעבור מימין לשמאל ומשמאל לימין, כאן:
כל ההסברים איפה מותקן ה AddIn, מוסבר שם.
 
כאן אני רק אציג מה אנחנו מקבלים.
 
אז את ההתקנה תוכלו להוריד מכאן. (כולל קוד המקור)
אחרי החילוץ קובץ ההתקנה נמצא: DeleteCAPTCHAInstaller\Debug
 
אחרי ההתקנה כשתלחצו קליק ימני על העכבר ב IE, תקבלו את הדבר הבא:
 
delete
 
 
כשתלחצו על Delete CAPTCHA, זה יעיף את הבדיקה, ותוכלו להגיב בלי להכניס את המספרים.
 
 
רק כדי שאף אחד לא יחשוב שאני מכניס לו וירוסים, אז הנה הסקריפט שרץ:
 
 

    1 <SCRIPT LANGUAGE = "JavaScript">

    2 

    3 // Get the window object where the context menu was opened.

    4 var oWindow = window.external.menuArguments;

    5 

    6 

    7 if(oWindow.location.host == "blogs.microsoft.co.il")

    8 {

    9     var oDocument = oWindow.document;

   10     for(var i = 0; i < oDocument.all.length; i++)

   11     {

   12         if(oDocument.all[i].clientvalidationfunction != null)

   13         {

   14             if(oDocument.all[i].clientvalidationfunction == 'ValidateCaptcha')

   15             {

   16                 oDocument.all[i].clientvalidationfunction = '';

   17                 break;

   18             }

   19         }

   20     }

   21 }

   22 </SCRIPT>

 
 
אני מקבל את החלון של ה menu.
 
בודק האם אני נמצא באתר הבלוגים.
 
רץ על כל האלמנטים בעמוד,
 
בודק עבור כל אלמנט, האם יש לו attrubute שנקרא clientvalidationfunction,
 
במידה וכן, האם הערך שלו זה 'ValidateCaptcha'
 
במידה וכן, נמחק את זה, ונצא מהלולאה.
 
 
מקווה שעשיתי לכם חיים קלים.

|Add onclick function(with parameters) using java script

 

נתקלתי היום בבעייה מעצבנת ב 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 }

איך לקבל את התפריטים, כש Internet Explorer במצב Full Screen

 

רציתי להפעיל את IE Developer Tollbar כשה explorer היה במצב של מסך מלא.
 
מה שמתברר, שאמנם זה מסך מלא.
 
אבל לחיצה על alt פותחת את התפריטים, ואפשר לטייל בין בתפריטים, בלי לראות את ה menu bar
 
Full screen
 
מה שכן, במידה והפעלתם את אינטרנט אקפלורר, מראש במסך מלא.
 
בצורה הבאה:
 
iexplore.exe -k
 
אני לא ממש מבין את התועלת של ה k- הזה.
 
אבל במקרה הזה אי אפשר לפתוח את שורת התפריטים.

IE Developer Toolbar כלי מדהים עבור מפתחים

 

כבר כתבתי בעבר על התיסכול שלי, ממערכות תוכן לא טובות (בלשון המעטה) שהופוכות אותי למתכנת html ו javaScript, (ללא כוונות פגיעה למתכנתי html)
 
בכל מקרה, אחד מהמשימות שלי היה, לשנות את המראה של מה שאנחנו מקבלים ממערכת התוכן,
 
לדוגמא:
שינוי צבע הרקע של העמוד.
או, בראש העמוד יש תמיד שני חלקים, אחד עבור תמונה, והשני עבור טקסט חופשי, והייתי אמור לאפשר להכניס תמונה שתתפרש על כל השטח. (גם על השטח של האיזור החופשי.)
 
 
אז איך פתרתי את הבעייה,
 
הפיתרון הוא פשוט. אחרי שהדף עולה, אני יכול להפעיל סקריפט שישנה את ההופעה של אלמנטים.
 
אבל כדי לדעת מה לשנות ואיך, אני משתמש ב IE Developer Toolbar
 
אחרי שהדף עולה, אני מפעיל את ה IE Developer Toolbar, על ידי
 
View->Explorer Bar->IE Developer Tool Bar
 
או על ידי לחיצה על החץ הקטן, ובחירה ב IE Developer Toolbar
 
tools
 
 
 
ואז בתחתית המסך נקבל את ה Developer ToolBar.
 
יש לו הרבה שימושים,
 
אבל מה שאהבתי, זה שיש לו את היכולת לשנות ערכים של ה html ב RunTime.
 
לדוגמא עם אני רוצה לשנות את ה Title של הפוסט שכתוב שם "שלמה גולדברג" ולהעלים אותו.
 
כך זה נראה לפני:
Title1
 
ואז אני אשתמש ב ToolBar כדי למצוא את האלמנט שזה div, ולהוסיף לו Display=none.
 
וזה יעלים אותו ב RunTime
 
Title2
 
 
אני בחרתי את ה div שמכיל את השם,
 
ואני מוסיף לו איזה סגנון שאני רוצה.
Title3
 
 
אחרי שהבנתי מה אני צריך לשנות.
 
בדוגמא, (אצלנו להעלים עמודה אחת של הטבלה, ולתת colspan=2 לעמודה שמכילה את התמונה, כדי שאני אוכל להכניס תמונה שתתפרש גם על האיזור החופשי)
 
אני רק צריך לכתוב את הסקריפט.
 
אבל אני יכול להגיד בוודאות שלולא ה IE Developer Tool Bar, החיים שלי היו הרבה יותר קשים.

איך לקבל ערכים מ Query String ב JavaScript

 

כשראיתי את הפוסט של שחר. נזכרתי שאח שלי יוסי כתב שני מתודות נחמדות ב JavaScript, שעוזרות לי לפרסר QueryString.
 
המתודה הראשונה, היא FIndByName, שמקבלת key וQueryString
 
ה QueryString, הינו פרמטר רשות, במידה והפונקצייה לא תקבל אותו, היא תקח את ה QueryString של העמוד הנוכחי.
 
המתודה השניה היא FindByIndex, שמקבלת מיקום ומחזירה את ה value.
 
 

    1 function FindByName(key, search)

    2 {

    3     if(search == undefined)

    4     {

    5         search = new String(window.location.search);

    6     }

    7 

    8     var indexOf = search.indexOf(key, 0);

    9     if(indexOf == -1)

   10     {

   11         return "";

   12     }

   13 

   14     var ampIntex = search.indexOf("&", indexOf);

   15 

   16     var value;

   17     if(ampIntex > -1)

   18     {

   19         value = search.substring(indexOf + key.length + 1,

   20                 search.indexOf("&", indexOf));

   21     }

   22     else

   23     {

   24         value = search.substring(indexOf + key.length + 1);

   25     }

   26 

   27     return unescape(value);

   28 }

   29 

   30 

   31 function FindByIndex(index, search)

   32 {

   33     if(search == undefined)

   34     {

   35         search = new String(window.location.search);

   36     }

   37 

   38     var ctrIndex = 0;

   39     while(index > -1 && ctrIndex > -1)

   40     {

   41         ctrIndex = search.indexOf("=", ctrIndex + 1);  

   42         index--;

   43     }

   44 

   45     if(ctrIndex < 0)

   46     {

   47         return "";

   48     }

   49 

   50     var ampIntex = search.indexOf("&", ctrIndex);

   51     var value;

   52     if(ampIntex > -1)

   53     {

   54         value = search.substring(ctrIndex + 1,

   55                 search.indexOf("&", ctrIndex));

   56     }

   57     else

   58     {

   59         value = search.substring(ctrIndex + 1);

   60     }

   61 

   62     return unescape(value);

   63 }