без переноса (голова) против onLoad - PullRequest
5 голосов
/ 12 октября 2011

В этой демонстрации я получил разные выходные данные, если я использую (без переноса) или (onLoad).

Мой вопрос в html-файле, чтобы получить правильное предупреждение:1,2,3,4 какое изменение нужно в коде?С простой загрузкой додзё я всегда получаю 4 во всех оповещениях:

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script>

 <script type="text/javascript">
    var slider = [];

    for (i = 0; i < 4; i++) {

        slider[i] = function () {

            alert([i]);

        };
        dojo.addOnLoad(slider[i]);
    }
    </script>

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Вы можете использовать замыкание :

var slider = [];

for (i = 1; i < 5; i++) {

    slider[i] = (function (i) {

        return function () { alert([i]); }

    })(i);
    dojo.addOnLoad(slider[i]);
}

Это сохранит i в другой области функций, сохраняя состояние. Без замыкания i ограничено исходной функцией.

0 голосов
/ 12 октября 2011

Значение i равно 4 в конце цикла, это то, что увидят ваши функции при вызове.Что-то вроде этого должно работать:

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script>

<script type="text/javascript">
var slider = [];

for (i = 0; i < 4; i++) {
    eval("slider[i] = function () { alert([" + i + "]);};");
    dojo.addOnLoad(slider[i]);
}
</script>

Edit: хорошо, вы также можете попробовать подсчитать при вызове функций, а не при их определении.например,

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script>

<script type="text/javascript">
var slider = [];
var onLoadCounter = 0;

var onLoadCallback = function() {
    alert(onLoadCounter);
    onLoadCounter++;
};

for (i = 0; i < 4; i++) {
    slider[i] = onLoadCallback;
    dojo.addOnLoad(slider[i]);
}
</script>
...