سؤال

أنا جديد على JavaScript وأواجه مشكلات مع هذا البرنامج النصي.إنها جزء من لعبة ويب ومن المفترض أن يقوم البرنامج النصي بتحديث الصفحة حتى يفوز اللاعب أو يخسر.لسبب ما لا يتوقف عن التحديث، قمت بوضع وظيفة تنبيه للتحقق مما إذا كانت الوظائف تعمل، وأحصل على التنبيهات ولكنها لا تزال مستمرة في تحديث الصفحة.ما الخطأ الذي افعله؟

var t;

$(document).ready(function () {
    intervals();
});
function intervals() {
    t = self.setInterval('refreshData()', 10000);
}
function youWin() {
    var f = $('#status:contains("YOU ARE THE WINNER!")');
    if (f.length > 0) {
        alert("YOU ARE THE WINNER!");
        t = clearInterval(t);
    }
}
function youlose() {
    var f = $('#status:contains("You lost!")');
    if (f.length > 0) {
        alert("You lost!");
        t = clearInterval(t);
    }
}
function refreshData() {
    $('#ajaxGame').load('RefreshCurrentPlayerServlet #ajaxGame');
    youWin();
    youlose();
}
هل كانت مفيدة؟

المحلول

تحتاج إلى إصلاح الإشارة إلى self وإصلاح .load() يتصل.

.load() غير متزامن لذا لا يكتمل قبل الاتصال youWin() و youLose() بعد ذلك مباشرة.أنت بحاجة إلى وظيفة إكمال حتى تتمكن من التحقق من الفوز أو الخسارة بعد .load() يكتمل بنجاح.

refreshData() يجب أن تكون منظمة على النحو التالي:

function refreshData() {
    $('#ajaxGame').load('RefreshCurrentPlayerServlet #ajaxGame', function() {
        youWin();
        youlose();
    });
}

يجب عليك أيضًا تغيير هذا:

t= self.setInterval('refreshData()',10000);

الى هذا:

t = window.setInterval(refreshData, 10000);

أنا لا أرى ذلك self تم تعريفه أيضًا بحيث يمكن أن يكون سببًا لمشكلتك أيضًا ويجب عليك استخدام مرجع الوظيفة مباشرةً بدلاً من وضعه في سلسلة.

وكمسألة تنظيف، يجب عليك تغيير حدثي هذا:

t = clearInterval(t);

الى هذا:

clearInterval(t);

فيما يلي نسخة نظيفة من التعليمات البرمجية التي تزيل أيضًا المتغيرات العامة وتعريفات الوظائف غير الضرورية:

$(document).ready(function() {
    var t = window.setInterval(function() {
        $('#ajaxGame').load('RefreshCurrentPlayerServlet #ajaxGame', function() {
            youWin();
            youlose();
        });
    }, 10000);

    function youWin()  {
        if ($('#status:contains("YOU ARE THE WINNER!")').length) {
            alert("YOU ARE THE WINNER!");
            clearInterval(t);
        }
    }

    function youlose() {
        if ($('#status:contains("You lost!")').length) {
            alert("You lost!");
            clearInterval(t);
        }
    }

});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top