Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > setTimeout


Автор: chertoss 29.9.2008, 16:42
Здравствуйте все!!
возникла такая проблема, есть код

Код

<!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>


почему не работает? разве нельзя передавать параметры в вункцию таким образом?

Автор: Dima 2015 29.9.2008, 17:01
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>

Автор: chertoss 29.9.2008, 17:15
Цитата

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

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

Цитата

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


не будет id, нужно как то через this передавать

Автор: Dima 2015 29.9.2008, 17:30
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

Автор: bars80080 29.9.2008, 17:39
Код

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

Автор: Dima 2015 29.9.2008, 17:45
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 на который мы кликаем) мы делаем ее видимой во всем коде...

Мне конечно это кажется кривоватым, но это все что удалось придумать.. :(

Автор: chertoss 29.9.2008, 17:48
bars80080, твой пример не работает  smile

Добавлено через 2 минуты и 37 секунд
Dima 2015, здорово, хотя и правда странно как то  smile 
ну надеюсь это именно то, что мне нужно, и далее задача решиться.. щас уже сил проверять нет  smile 

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

значит неправильно используешь.

Автор: Dima 2015 29.9.2008, 23:28
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

А ты то что имел в виду?

Автор: ksnk 30.9.2008, 08:00
Код

<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...

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

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

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

Автор: bars80080 5.9.2010, 11:37
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() не подлежат, а только после вызова

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)