Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.02.2013, 18:59
Интересующийся
Отправить личное сообщение для HaseProgram Посмотреть профиль Найти все сообщения от HaseProgram
 
Регистрация: 07.03.2012
Сообщений: 28

Проблема с массивами
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? Заранее спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 23.02.2013, 19:45
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

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

fileref[i].onload = (function(i){
    return function() {
        console.log(fname[i] + " loaded successful")
    }
})(i);
Ответить с цитированием
  #3 (permalink)  
Старый 23.02.2013, 19:51
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

Можно завести отдельную функцию для определения 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]);
}

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с обработкой ескольких .hover() anocean jQuery 3 15.06.2012 22:43
Проблема с массивами! Solovei95 Общие вопросы Javascript 1 23.05.2011 13:15
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с массивами. RRRinat Общие вопросы Javascript 2 20.06.2009 23:10
Проблема спама lliberty AJAX и COMET 1 12.03.2009 16:47