Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> setTimeout, запустить по таймауту ф-ию с параметром 
V
    Опции темы
chertoss
Дата 29.9.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 28.7.2008

Репутация: 1
Всего: 2



Здравствуйте все!!
возникла такая проблема, есть код

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>
  <title></title>
  <script language="JavaScript" type="text/javascript">
  /*<![CDATA[*/
  function hide(m){
    m.style.display = "none";
  }
  /*]]>*/
  </script>
</head>

<body>

<div onclick="setTimeout('hide(this)', 2000);">asdgfh</div>

</body>

</html>


почему не работает? разве нельзя передавать параметры в вункцию таким образом?
PM MAIL   Вверх
Dima 2015
Дата 29.9.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



chertoss, передавать то параметры можно. Но если написать вот так:

Код

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <title></title>
  <script language="JavaScript" type="text/javascript">
  function hide(m){
    alert(m);  // А что же у нас такое передается в фцию
    m.style.display = "none";
  }
  </script>
</head>
<body>
<div onclick="setTimeout('hide(this)', 200);">asdgfh</div>
</body>
</html>


Мы увидим что m есть object Window. Я так понимаю что в данном случае this, который тут onclick="setTimeout('hide(this)', 200);" уже не указывает на элемент div, а указывает на объект Window, к которому относится метод setTimeout. Хотя это только мои догадки...

Просто если ты напишешь <div onclick="alert(this)">asdgfh</div> то увидишь, что алерт выведет HTMLDivElement, есть разница?

Что делать.. ну можно лишь посоветовать setTimeout засунуть внутрь ф-ции hide, и вызывать так: <div onclick="hide(this);">asdgfh</div>

Хотя я полагаю вопрос то как раз в том как передать элемент, на который кликаем в ф-цию setTimeout. Ну если через this никак, то можно только по id посоветовать:

Код

<div id = "MyDiv" onclick="setTimeout('hide(document.getElementById(\'MyDiv\'))', 200);">asdgfh</div>

PM MAIL ICQ   Вверх
chertoss
Дата 29.9.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 28.7.2008

Репутация: 1
Всего: 2



Цитата

можно лишь посоветовать setTimeout засунуть внутрь ф-ции hide

можно пример, не совсем понимаю, как это должно выглядеть на практике

Цитата

можно только по id посоветовать


не будет id, нужно как то через this передавать
PM MAIL   Вверх
Dima 2015
Дата 29.9.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



chertoss, мм.. чтото с ходу не получилось, имел в виду это:

Код

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <title></title>
  <script language="JavaScript" type="text/javascript">
  function div_hide(m) {
    setTimeout(m + '.style.display = "none"', 2000);

  }
  </script>
</head>
<body>
<div onclick="div_hide(this);">asdgfh</div>
</body>
</html>


Но это не работает, по странной причине - m видит как [object HTMLDivElement].style.display = "none"...

Надо както додумывать как объект в setTimeout передать, пока чтото не додумывается, может кто поумнее подскажет... smile
PM MAIL ICQ   Вверх
bars80080
Дата 29.9.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



Код

setTimeout(function(){hide(this);}, 2000); }

PM MAIL WWW   Вверх
Dima 2015
Дата 29.9.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



chertoss, разобрался. Будет работать вот так:

Код

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <title></title>
  <script language="JavaScript" type="text/javascript">
  var el;
  function div_hide(m) {
    el = m;
    setTimeout('el.style.display = "none"', 2000);
  }
  
  </script>
</head>
<body>
<div style="display: block" onclick="div_hide(this);">asdgfh</div>
</body>
</html>


Смотрел только в ФФ, но надеюсь тут не должно быть с другими бразуерами проблем. Признаюсь я смутно понимаю в чем тут дело, могу лишь вилами по воде водить... но я понимаю так: запуская setTimeout мы должны в него объект передать, а переменная m внутри ф-ции div_hide() локальная, и поэтому внутри setTimeout уже не видна. Поэтому создавая глобальную переменную el и записывая в нее объект (this, который суть div на который мы кликаем) мы делаем ее видимой во всем коде...

Мне конечно это кажется кривоватым, но это все что удалось придумать.. :(
PM MAIL ICQ   Вверх
chertoss
Дата 29.9.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 28.7.2008

Репутация: 1
Всего: 2



bars80080, твой пример не работает  smile

Добавлено через 2 минуты и 37 секунд
Dima 2015, здорово, хотя и правда странно как то  smile 
ну надеюсь это именно то, что мне нужно, и далее задача решиться.. щас уже сил проверять нет  smile 
PM MAIL   Вверх
bars80080
Дата 29.9.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



Цитата(chertoss @  29.9.2008,  17:48 Найти цитируемый пост)
bars80080, твой пример не работает  

значит неправильно используешь.
PM MAIL WWW   Вверх
Dima 2015
Дата 29.9.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



bars80080, слушай дружище, может ты сам прольешь тогда свет на то как надо было использовать твой метод? А то вот я чего-то пытаюсь, тоже никак не выходит... Ну начнем с того что там у тебя видимо скобка лишняя в конце фигурная, но я вот так пытался:

Код

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <title></title>
  <script language="JavaScript" type="text/javascript">
  function hide(m){
    alert(m);
    m.style.display = "none";
  }
  </script>
</head>
<body>
<div onclick="setTimeout(function(){hide(this);}, 2000);">asdgfh</div>
</body>
</html>


В m попадает object window, и соотв. ошибка m.style is undefined

А ты то что имел в виду?
PM MAIL ICQ   Вверх
ksnk
Дата 30.9.2008, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Код

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <title></title>
  <script language="JavaScript" type="text/javascript">
  function hide_slow(m){
    setTimeout(
     function(){
        m.style.display = "none";
     },
     2000)
  }
  </script>
</head>
<body>
<div onclick="hide_slow(this);">asdgfh</div>
</body>
</html>

работает это по той-же магической причине, что и пример Dima 2015, только , imho, без лишнего eval'a...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
chertoss
Дата 30.9.2008, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 28.7.2008

Репутация: 1
Всего: 2



даа.. бывает же)) казалось бы простые вещи, а вот оно как получается..  smile 
в общем спасибо всем, кто помог (Dima 2015, bars80080, ksnk).. задача решена  smile 

Это сообщение отредактировал(а) chertoss - 30.9.2008, 09:34
PM MAIL   Вверх
Alexey91
Дата 5.9.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



setTimeout(function(){chg_img(delay_clk);},delay_clk); 
почему, когда я пишу так в функцию параметр передается

а если писать setTimeout(chg_img(delay_clk),delay_clk); 
то ничего не передается ?? 
PM   Вверх
bars80080
Дата 5.9.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



Alexey91, вы не пробовали для своих вопросов, создавать свою тему, чтобы остальным не пришлось долго читать весь текст, чтобы потом обнаружить, что вопрос совсем другой




Цитата(Alexey91 @  5.9.2010,  10:35 Найти цитируемый пост)
setTimeout(function(){chg_img(delay_clk);},delay_clk); 
почему, когда я пишу так в функцию параметр передается

а если писать setTimeout(chg_img(delay_clk),delay_clk); 
то ничего не передается ??  

потому что во втором случае в качестве первого параметра задаётся результат функции, а не указатель за неё.

интерпретатор javascript идёт по написанным строчкам и исполняет их. во втором варианте он видит chg_img(delay_clk), исполняет её в соответствии с текущим значением delay_clk, а результат передаёт в грядущий вызов таймера.
в первом случае интерпретатор видит function(){chg_img(delay_clk);}, определяет эту функцию, и передаёт в таймер указатель на неё. когда подходит время, эта функция вызывается

очевидно, что если в коде написать:
Код

alert(1);
function qw() {
    alert(2);
}
alert(3);
qw();


то вывод будет 1, 3, 2. так как немедленному исполнению внутренности function qw() не подлежат, а только после вызова
PM MAIL WWW   Вверх
Alexey91
Дата 5.9.2010, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Bars, я как раз хотел создать отдельную тему, но подумал, что лучше будет, если в этой  smile 
Хорошо, в следующий раз буду создавать отдельную тему..

СПАСИБО, БАРС

Это сообщение отредактировал(а) Alexey91 - 5.9.2010, 14:59
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.