הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   קריאה לפונקציה שנמצאת בתוך $(document).ready() מבחוץ (https://hosts.co.il/forums/showthread.php?t=91272)

Itay 06-08-11 12:55

קריאה לפונקציה שנמצאת בתוך $(document).ready() מבחוץ
 
מישהו יודע איך אפשר לקרוא לפונקצייה שמוגדרת בתוך $(document).ready() מפונקציה שנמצא מבחוץ?
כלומר משהו כזה:
קוד:

function CallMe()
{
    someFunc();
}

$(document).ready(function()
{
    function someFunc()
    {
        alert('something');
    }
});

באופן כללי - יש לי timeout שמוגדר בתוך פונקציה שמוגדרת בתוך ready() - אני צריך דרך פונקציה שמופעלת מבחוץ לנקות את הטיים-אווט הזה.

BlueNosE 06-08-11 14:22

קוד:

$(document).ready(function()
{
    var someFunc = function()
    {
        alert('something');
    };
});


function CallMe()
{
    $(function() {
      someFunc();
    });
}


Itay 06-08-11 14:35

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

BlueNosE 06-08-11 14:58

תוכל להביא פה את הקוד תכלס? אולי הבעיה בTIMEOUT

Itay 06-08-11 15:09

יש לי -Timeout שמוגדר ככה (בתוך ה-ready):
קוד:

nextTO = setTimeout( function() { next(); } , 15000);
הגדרתי בתוך ה-ready() כמו שאמרת בצורה הזאת:
קוד:

var stopTO = function() { clearTimeout(nextTO); alert('test'); }
ויש לי פונקציה מבחוץ שמוגדרת ככה:
קוד:

function onStateChange(newState)
{
    if(newState > 0)
    {
        $(function()
        {
            alert(newState); // עובד
            stopTO();
            alert('test 11'); // לא עובד
        });
        document.getElementById("blala").innerHTML = "stopped"; // לא עובד
    }
}

אני לא מביא את כל הקוד כי הוא סתם ארוך ולא קשור לעניין הזה

BlueNosE 06-08-11 15:31

קודם כל תוסיף var לפני הnextTO.
דבר שני אם אתה מגדיר את הפונקציה רק לאחר הטעינה אפשר לקצר תהליכים:
קוד:

$(function() { // כמו document.ready
var nextTO = setTimeout( function() { next(); } , 15000);
});
function onStateChange(newState)
{
    if(newState > 0)
    {
        $(function()
        {
            alert(newState); // עובד
            clearTimeout(nextTO); alert('test');
            alert('test 11'); // לא עובד
        });
        document.getElementById("blala").innerHTML = "stopped"; // לא עובד
    }
}

מה שאנחנו עושים פה, זה מוסיפים לתור את הclearTimeout, ובגלל שהוא נוסף לתור אחרי שnextTO מאותחל, אין שום בעיה לקרוא לו בצורה הזאת בלי לחשוש משגיאה.

Shay Ben Moshe 06-08-11 15:44

אתה לא יכול, או לפחות לא אמור להיות מסוגל.
זה לא באותו scope, זה לא אמור לפעול.

אתה יכול להצהיר על משתנה בחוץ, ולתת לו ערך בפנים, אבל בגדול global variables זה bad practice.

BlueNosE 06-08-11 16:47

ציטוט:

נכתב במקור על ידי Shay Falador (פרסם 813726)
אתה לא יכול, או לפחות לא אמור להיות מסוגל.
זה לא באותו scope, זה לא אמור לפעול.

אתה יכול להצהיר על משתנה בחוץ, ולתת לו ערך בפנים, אבל בגדול global variables זה bad practice.

זה JS, אין באמת Scope. אולי בתפיסה הקלאסית זה לא נכון, אבל JS רחוק שנות אור מתכנות קלאסי.

אגב, אם כבר נכנסים לעניין של bad practice, באופן אישי באמת הייתי מעדיף לרשום:
קוד:

$(function() {
TO.set(15000);
});

var TO = {
  obj : null,
  set : function(time) {
    this.obj = setTimeout( function() { next(); } , time);
  },
  nullify : function() {
    clearTimeout(this.obj);
  }
};

function onStateChange(newState)
{
    if(newState > 0)
    {
        $(TO.nullify);
        document.getElementById("blala").innerHTML = "stopped"; // לא עובד
    }
}


Itay 06-08-11 17:16

אין לי כ"כ חשק להתחיל לשנות את כל המבנה עכשיו (אם זאת תהיה הברירה היחידה אני אעשה את זה), אבל הדבר הראשון שכתבת גם לא עבד.
הגדרתי את nextTO בתור var וזה לא עוזר. עשיתי אלרט של טייפ-אוף ובפונקציה onStateChange (זאת שבחוץ) זה מחזיר לי undefined ואם אני עושה באותה פונקציה שמגדירה את זה זה רושם לי number

BlueNosE 06-08-11 18:59

אוקיי, הרצתי את הקוד, הבעיה מעצבנת וקשורה בסמנטיקה של Javascript.
לא עובד:
קוד:

$(function() {
var nextTO = setTimeout( function() { next(); } , 15000);
});

עובד:
קוד:

var nextTo;
$(function() {
nextTO = setTimeout( function() { next(); } , 15000);
});

מעצבן, אבל עובד


כל הזמנים הם GMT +2. הזמן כעת הוא 23:37.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ