Показать сообщение отдельно
  #6 (permalink)  
Старый 03.07.2012, 18:42
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Maksimchik
Я разобрался. Получается если что onmouse(move/out/...) какбы выполняют код из самого тега, и поэтому не находило переменных.
если таков вывод - то "нет, не разобрался".


Сообщение от Maksimchik
Если можно как то полегче обойти, прошу в студию. ^_^
конечно, для этого мы здесь.

window.onload = function(){  // *!*(0)*/!*
	var menuimgs = document.getElementsByTagName("img");  // *!*(1)*/!*
        /* КОД.....  */
			menuimgs.item(i).onmouseout = "menuimgs.item(i).style.width = '32px';"; // *!*(2)*/!*
        /* КОД */
}

Начну я свой ответ с того, что в JS есть области видимости. (наверняка Вы знаете, что это такое. Если нет - прошу погуглить ). Т.е. переменная, определённая с локальной области, будет невидима в глобальной.
Отлично. что дальше?

Как видим на строке с отметкой 0, у нас (у Вас) там имеется функция-обработчик события завершения загрузки страницы. Т.е. функция-обработчик имеет свою область видимости (Ваш К.О.)...

Копаем дальше. Отметка 1 при исполнении этой функции создаётся локальная область видимости, и в неё помещается menuimgs (очевидно).

Далее в onmouseout мы помещаем строку-функцию, которая, как ожидается, должна нормально хавать локальную область видимости. Отметка 2. А вот тут и ошибочка. Почему?

Ответ прост :

Строка эта исполняется, как код функции. Какой единственный способ так сделать? Правильно, конструктор функций new Function. А он видит только глобальную область видимости. А т.к. переменная не определена в глобальной области - её нет. Это и вызывает ошибку.
Пример кода в тему :
var foo = "foo";

(function () {
    var bar = "bar";
    try { 
        new Function("", "alert(foo + bar)")();
    } catch (e) { 
        alert(':)');
    }
})();


Как решить? подсказка : обработчики событий - это функции, а не строки

Последний раз редактировалось melky, 03.07.2012 в 18:45.
Ответить с цитированием