Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Можно ли "повесить" внутренние функции на кнопки? (https://javascript.ru/forum/misc/60517-mozhno-li-povesit-vnutrennie-funkcii-na-knopki.html)

Keramet 04.01.2016 21:50

по клину на кнопке Вы запускаете функцию main, это вроде понятно. Я просто не пойму, где происходит вызов st(). Ведь внутри main она не вызывается, только определяется.

Keramet 04.01.2016 21:53

моя логика была такая: вот эти строки
var tmr;
    function stopMove ()    { clearInterval(tmr); }
    function startMove ()   { tmr = setInterval(moveBtn, 24); }

не определять в глобальном контексте, а сделать это внутри функции (в данном случае main), которая запуститься как только броузер построит ДОМ ))

рони 04.01.2016 21:53

Цитата:

Сообщение от Keramet
по клину на кнопке Вы запускаете функцию main

нет - запускается не main а st -- в обоих вариантах

рони 04.01.2016 21:55

Цитата:

Сообщение от Keramet
которая запуститься как только броузер построит ДОМ

тогда main()() вместо $("#btn").on({click : main()})

Keramet 04.01.2016 21:56

Цитата:

Сообщение от рони (Сообщение 402567)
нет - запускается не main а st -- в обоих вариантах

Если Вам не сложно, можете указать, в какой строке Вашего кода происходит вызов st()?

рони 04.01.2016 22:00

Цитата:

Сообщение от Keramet
Если Вам не сложно, можете указать, в какой строке Вашего кода происходит вызов st()?

когда вы кликаите по кнопке $("#btn").on({click : main()}) -- main() в этой строке превратилось в st !!!
смотрите ранее что возвращает main => return st;

Keramet 04.01.2016 22:04

рони,
а, теперь вроде догоняю))

рони 04.01.2016 22:09

Keramet,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script>
  var main = function () {

	var tmr;
	function stop()	    { clearInterval(tmr); }
	function st()	{ tmr = setInterval(moveBtn, 24); }

	var moveBtn = function () {
		var btn = $("#btn");
		var left = parseInt( btn.css("margin-Left") ) + 1;
		btn.css("margin-Left", left + "px");
	};
    st()
	return st;
};
$(main);


  </script>
</head>

<body>
<input type='button' id="btn"  value="click">




</body>

</html>

Erolast 04.01.2016 23:06

Цитата:

не определять в глобальном контексте, а сделать это внутри функции (в данном случае main), которая запуститься как только броузер построит ДОМ ))
Зачем?
Если определить функции внутри другой функции, то они только в ней видны и будут. Обработчики событий на элементах выполняются в глобальной контексте, и, соответственно, ни о каких stopMove и startMove они знать в принципе не могут.

Так что либо навешивай обработчик программно внутри функции main:
var main = function() {
    "use strict";
    var tmr;
    function stopMove ()    { clearInterval(tmr); }
    function startMove ()   { tmr = setInterval(moveBtn, 24); }
     
    function moveBtn() { //Объявляй уж в одном стиле
        var btn = $("#btn");
        var left = parseInt( btn.css("margin-Left") ) + 1;
        btn.css("margin-Left", left + "px");
    };
    
    $("#btn").on("click", startMove);
};
$(document).ready(main);


Либо объявляй функции глобально.

Keramet 04.01.2016 23:59

Цитата:

Сообщение от Erolast (Сообщение 402578)
Зачем?

в качестве эксперимента (идёт мой процесс обучения :help: )

Цитата:

Сообщение от Erolast (Сообщение 402578)
Зачем?
Если определить функции внутри другой функции, то они только в ней видны и будут.

я это понял. Хотел узнать, смогут ли в этом случае помочь замыкания

Цитата:

Сообщение от Erolast (Сообщение 402578)
Обработчики событий на элементах выполняются в глобальной контексте, и, соответственно, ни о каких stopMove и startMove они знать в принципе не могут.

я думал, что вызвав функцию main и вернув из неё обработчик, он (обработчик) будет доступен (благодаря замыканию).

Цитата:

Сообщение от Erolast (Сообщение 402578)
function moveBtn() { //Объявляй уж в одном стиле

а что не так я сделал?


Часовой пояс GMT +3, время: 04:33.