Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблема с массивами (https://javascript.ru/forum/misc/35828-problema-s-massivami.html)

HaseProgram 23.02.2013 18:59

Проблема с массивами
 
var loadJavaScriptFiles = {
		jQuery : "ljs",
		core : "js",
		common : "tjs",
	}
	
	function dynamicLoad(filesArray){
		var i = 0
		var fname = new Array
		var fileref = new Array
		var fileSRC = {
			ljs : "engine/javascript/library/",
			js : "engine/javascript/",
			tjs : "templates/{LANG}/{TEMP}/javascript/",
			css : "engine/pages/css/",
			tcss : "templates/{LANG}/{TEMP}/css"
		}
		for (var key in filesArray) {
			var filetype = filesArray[key]
			var fileName = key
			if (filetype=="js"|| filetype=="ljs" || filetype=="tjs") {
				fileref[i]=document.createElement('script')
				fileref[i].setAttribute("type","text/javascript")
				fileref[i].setAttribute("src", fileSRC[filetype] + fileName + ".js")
				fname[i] = fileName + ".js"
			}
			else if (filetype=="css" || filetype=="tcss"){
				fileref[i]=document.createElement("link")
				fileref[i].setAttribute("rel", "stylesheet")
				fileref[i].setAttribute("type", "text/css")
				fileref[i].setAttribute("href", fileSRC[filetype] + fileName + ".css")
				fname[i] = fileName + ".css"
			}
			if (typeof fileref[i]!="undefined") {
				document.getElementsByTagName("head")[0].appendChild(fileref[i])
			}
			i = i + 1;
		}
		for (i = 0; i<fileref.length; i++) {
			fileref[i].onload = function() {
				console.log(fname[i] + " loaded successful")
			}
			fileref[i].onerror = function() {
				console.log("Some error occurred with loading " + fname[i])
			}
		}
	}
</script>
<script>
	dynamicLoad(loadJavaScriptFiles);
</script>


Вот, выделил основное в скрипте. Вопрос, почему в логах консоли выводится: undefined loaded successful? Заранее спасибо!

danik.js 23.02.2013 19:45

Потому что когда скрипт загрузится, в момент выполнения функции onload значение переменной i уже будет другое (хотя по идее оно останется равным liferef.length - 1, но только если вы не вызываете dynamicLoad повторно).

Исправить можно так:

fileref[i].onload = (function(i){
    return function() {
        console.log(fname[i] + " loaded successful")
    }
})(i);

Amphiluke 23.02.2013 19:51

Можно завести отдельную функцию для определения callback`ов. К примеру,
function setCallbacks(fileref, fname) {
    fileref.onload = function() {
        console.log(fname + " loaded successfully");
    };
    fileref.onerror = function() {
        console.log("Some error occurred with loading " + fname);
    };
}
...
for (i = 0; i<fileref.length; i++) {
    setCallbacks(fileref[i], fname[i]);
}

(Экономия на создании функций в цикле)


Часовой пояс GMT +3, время: 10:27.