DCSIMG
רישום לאירוע בזמן סגירת הדפדפן - שלמה גולדברג (הרב דוטנט)

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

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

רישום לאירוע בזמן סגירת הדפדפן

אחד מהדברים שאנחנו כמפתחי WEB נתקלים בהם מידי פעם, היא כיצד לדעת מתי הדפדפן נסגר, בדרך כלל הסיבה שאנחנו רוצים לדעת זאת היא בכדי לנקות Session שאין צורך בו עוד, אך לא רק.
 
הבעייה הגדולה עם הרצון לדעת מתי המשתמש לחץ על ה - X הוא שזה נוגד את חוקי ה - Security של הדפדפן, הפיתרון הלכאורה פשוט הוא להרשם לאירוע unload ולכתוב קוד כלשהו, הבעייה עם השיטה הזו היא שאירוע זה קורה בכל PostBack מה שאומר שאם יש טופס עם לחצנים כל לחצן יפעיל את הקוד שלכאורה אמור להתבצע רק בזמן סגירת הדפדפן.
 
באחד הייעוצים בהם הייתי, ראיתי פיתרון מאוד מעניין - אמנם משתמשים בו במשהו מאוד ישן - אך עובד.
 
הרעיון הוא להגדיר frameset המכיל שני frames, העליון בגובה של 100% המכיל את האפליקצייה עצמה, והשני שלא רואים אותו יכיל רישום לאירוע של unload, האירוע הזה יתבצע בהכרח רק כשהדפדפן ייסגר מכיוון שבכל PostBack אחר מה שמתרפרש הוא החלר העליון.
 
 
קובץ ה - frameset:
 

<html>

<frameset rows="100%,0%">

  <frame src="application.htm" />

  <frame src="buttom.htm" />

</frameset>

</html>

 

קובץ ה - application הוא כמובן האתר שלכם, קובץ ה - buttom מכיל את הקוד הבא:

    <script>

        $(window).unload(function () {

            $.ajax({

                url: "http://localhost:3328/WebService1.asmx/EndSession",

                async: false

            });

        });

    </script>

 
חשווב להשתמש עם ספריית AJAX המאפשר פעולת סינכרונית, asp.net ajax עם script manager לא מאפשר פעולות סינכרוניות ובמקרה כזה הדפדפן עלול להסגר לפני הקריאה לשרת, מה שיגרום לביטול הקריאה לשרת.
 
קוד ה - service:

    public class WebService1 : System.Web.Services.WebService

    {

        [WebMethod(EnableSession = true)]

        public void EndSession()

        {

            HttpContext.Current.Session.Abandon();

        }

    }

 
חשוב כמובן להוסיף בקונפיג את הקוד הבא:

      <webServices>

        <protocols>

          <add name="HttpGet"/>

          <add name="HttpPost"/>

        </protocols>

      </webServices>

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

תוכן התגובה

Arnold כתב/ה:

לצערי דבר כזה לא יעבוד טוב ברוב הדפדפנים.

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

הדרך המומלצת היא להשתשמש בכתיבת ajax קלאסית ולא בעזרת jquery

# August 30, 2011 11:05 AM

Shlomo כתב/ה:

יתכן שאתה צודק בדוגמא שכתבתי היות שהשתמשתי ב - unload, אך במקרה שתרשם לפונקציית beforeunload (לפי הרבה בדיקות) זה תמיד עובד בכולם.

# August 31, 2011 10:39 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 8 and 6 and type the answer here:


Enter the numbers above: