Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: JavaScript не понял код
 
 автор: AlexanderG   (07.08.2007 в 10:57)   письмо автору
 
 

Не могу разобрать код, не могу найти в мануалах объяснение. далее фрагментами как оно идет по порядку в js файле


// фрагмент 1, так для справки
function run_after_body() {
        document.onmousemove = document_onmousemove; // тут ясно, что навешивается обработчик события, но почему-то без параметра
}

// ..
// Функция определяется с параметром 'e' , по ходу используется в теле функции
function document_onmousemove(e) {
       // .. код с использованием параметра e, как я понял, это объект типа событие
}

// ..

function func_my() {
// ..
document_onmousemove; // вызывается без параметра, что собственно непонятно
// ..
}


Собственно пытаюсь разобраться в коде wallpapers.ru . Там при наведении на картинку всплывает окошко с картинкой побольше.
Вопрос: пытаюсь переписать код под себя кусками, функция требует параметр, в общем ошибки лезут..

   
 
 автор: elenaki   (07.08.2007 в 13:54)   письмо автору
 
   для: AlexanderG   (07.08.2007 в 10:57)
 

что за фрагменты? никакого отношения к тому скрипту...
берем имя картинки, смотрим код страницы, находим по имени картинки функции,

onMouseOver=show_200("/zakroma/pre2/200708/122642.jpg","122642",200,160) onMouseOut=hide_div() 
onerror=gag(this,100)

грузим
себе скрипт http://www.wallpapers.ru/main/com/wallpapers.js (см.аттач)
находим в нем эти функции.


function show_200(img_src,wp_id,img_w,img_h) {
   if (show_delay) {
      clearTimeout(show_delay); show_delay = null;
   } else {
      obj_float_div = get_obj('div_200');
      show_delay = setTimeout('show_200("' + img_src + '","' + wp_id + '",' + img_w + ',' + img_h+ ');', 400);
      return;
   }
   var img_mark = 'img_wp_id_' + wp_id;
   active_img_mark = img_mark;
   if (preloads[img_mark] && preloads[img_mark].complete) {
      swap_img(img_mark);
   } else {
      var rnd_200 = Math.round(Math.random()*4) + 7;
      swap_img('loader_' + rnd_200);
   }
   if ( ! preloads[img_mark] ) {
      preloads[img_mark] = new Image;
      preloads[img_mark].src = zakroma + img_src;
      preloads[img_mark].width = img_w;
      preloads[img_mark].height = img_h;
      preloads[img_mark].onerror = function() { gag(preloads[img_mark],200); }
   }
   show_div('div_200');
}


function hide_div() {
   //var rnd_200 = Math.round(Math.random()*4) + 7; swap_img('loader_' + rnd_200);
   clearTimeout(show_delay); show_delay = null;
   if ( ! obj_float_div ) return;
   obj_float_div.style.visibility = 'hidden';
   obj_float_div.style.left = "-3000px";
   obj_float_div = false;
}

function gag(object,type) {
   if (gags[object.src]) return;
   if (type == 100) {
      object.src = zakroma + "/main/200x150/gag_100.gif";
      object.height = 75; // äëÿ Opera
      object.style.height = "75px"; // äëÿ Gecko, IE
   } else {
      object.src = zakroma + "/main/200x150/gag_200.gif";
      object.height = 150;
      object.style.height = "150px";
   }
   object.style.display = "block"; // äëÿ Gecko
   gags[object.src] = true;
}

   
 
 автор: CNT   (07.08.2007 в 14:05)   письмо автору
 
   для: AlexanderG   (07.08.2007 в 10:57)
 

По фрагменту 1. Всё правильно - синтаксис яваскрипта так и предписывает: Calling a function without parentheses causes the text of the function to be returned instead of the results of the function., т.е. вызывая функцию без скобок и параметров, вы как бы вызываете только текст функции в виде строки.
Если стоит оператор присваивания к какому-то событию, то, значит, эту строку (текст функции) вы назначаете для события как функцию.
Пример (смотреть в MSIE, ибо использован, для примера, его синтаксис - но смсл аналогичен для всех браузеров):
<html>
<head>
<script>
function abc (х) {alert (х); event.returnValue =                     false          }

onload = function () {document.getElementById ('mL').onclick = abc}
</script>
<head>
<body>
<a href="#" onclick="abc (this.innerHTML)">этот текст увидишь в алерте</a>
<hr>
<a href="#" onclick="alert (abc)">увидишь код функции</a>
<hr>
<a id="mL" href="#">увидишь undefined (функция назначена, но не передан параметр)</a>
</body>
</html>

PS. Эту фичу ("код функции как строка при вызове без скобок") я давно использовал в качестве немудрённого способа защиты своих кодов. Код функции писал, используя много-много бессистемных пробелов (см. около слова false в примере) и переводов строк. Получалось определенноё число символов в этой самой строке (коде функции), ну а потом где-либо вызывал текст кода функции и проверял - в том ли конкретном месте в коде функции (по индексу) находится та или иная подстрока. Если - "в том", то шло выполнение, если "не в том", то ничего не работало.
"Передиральщики кодов" обычно "улучшают" его структуру и внешний вид кода: убирают пробелы, строки, переименовывают переменные... В итоге получают неработающий скрипт :-)))

По фрагменту 2. Отрыжка древней версии яваскрипта - при использовании объекта event (и только в этом случае) его требовалось передавать в качестве параметра и в описание функции вводить для него переменную в качестве аргумента. В MSIE от этой глупости ушли - объект event сделали глобальным и доступ к нему возможен из любой функции. Mozilla же до сих пор придерживается старого формата - event в Mozilla является полуглобальным объектом - напрямую его использовать можно, а в функции - только через передачу параметр-аргумент.

По фрагменту 3. Написан явный бред, ни на что не влияющий. Можете спокойно убрать без ущерба для функциональности.

   
 
 автор: AlexanderG   (07.08.2007 в 15:42)   письмо автору
 
   для: CNT   (07.08.2007 в 14:05)
 

Спасибо за ответ. Не спорю, довольно толково все написали.
Я не понял другого: на обработчик навешиваем текст функции document_onmousemove(e).

При этом параметр 'e' в самом тексте (коде) используется. Получается что при обработке события тупо в идет обращение к тексту-коду, где содержится параметр 'e' , который нигде не указан

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования