JQuery - функция работает без предупреждения, пожалуйста, сообщите - PullRequest
3 голосов
/ 12 августа 2011

Я пишу психологический эксперимент в jQuery.Я хочу написать функцию, которая начнет упражнение, когда пользователь нажимает p или q.У меня это работает:

$(function trial() {
$("body").keydown(function(e) {
    if (e.which == 81 || e.which == 80)
        {
        $(".message").text("exercise begun (timestamp)");
        var refreshId = setTimeout(timeout, 2000);
        }
});
});

Но я запутался в одном: эта функция, trial (), запускается автоматически.Я хотел бы позвонить, чтобы он побежал.Например, эта функция

function timeout(x) {
var x = trialNum
$(".message").prepend("Timeout (Trial " + x + ")<br>");
}

, которая вызывается методом trial (), ведет себя хорошо, она не запускается без вызова.Я предполагаю, что это как-то связано с символом $ и областью действия?Вся помощь приветствуется.

О!Дополнительно еще один вопрос.Я пытался создать рекурсивную функцию jQuery, и у меня было много проблем с ней.Какой лучший способ сделать сам вызов функции?

Ответы [ 7 ]

10 голосов
/ 12 августа 2011

Это потому, что вы передаете ссылку на него в $() (он же jQuery()), который является ярлыком для функции ready и запускается, когда DOM загружен.


Не по теме : Кстати, делая это, вы используете функцию в качестве правого значения (как что-то в правой части = знак). Это делает его функциональным выражением . Поскольку вы назвали функцию (что является хорошей вещью для ), это названное выражение функции. Те, которые исторически не работали хорошо в различных реализациях JavaScript. С большинством современных браузеров (сейчас) все в порядке, кроме IE до IE9, который создаст две полностью отдельных функции, подробнее здесь: Double take

3 голосов
/ 12 августа 2011

Окружая function trial() { ... } $( и );, вы вызываете его, когда документ готов. Это сокращение для $(document).ready(function trial() { ... }); [ API Ref ]

Если вы не хотите этого делать, удалите окружающие $( и );.

2 голосов
/ 12 августа 2011

Чтобы ответить на ваш первый вопрос, $(function(){...code...}) является ярлыком jQuery для $(document).ready(function(){...code...});, который запускается, как только DOM достигает состояния ready.

О вашем втором вопросе (он принадлежитотдельный вопрос по SO, но я все равно на него отвечу):

Функции в jQuery ничем не отличаются от функций в JavaScript.Именованные функции могут вызывать себя рекурсивно, используя собственное имя:

function foo(bar, baz)
{
  ...do some stuff...
  if (--bar)
  {
    foo(bar, baz);
  }
}

Вам нужно будет более точно указать, чего вы хотите достичь с помощью рекурсивной функции, и если вы собираетесь это сделать,пожалуйста, откройте отдельный вопрос по StackOverflow.

0 голосов
/ 12 августа 2011

Попробуйте следующее:

$(function(){
trial = function(){
// Your code here
};
});
0 голосов
/ 12 августа 2011

$() - это сокращение для события готовности DOM. Он просто выполняет переданную ему функцию. Чтобы решить эту проблему, используйте $(document).ready само:

$(document).ready(function(){
   function trial() {
        $("body").keydown(function(e) {
        if (e.which == 81 || e.which == 80){
             $(".message").text("exercise begun (timestamp)");
             var refreshId = setTimeout(timeout, 2000);
        }
   }
});
0 голосов
/ 12 августа 2011

Попробуйте сделать это: $(function trial() заставит его работать автоматически.

Я не знаю почему, но jQuery просто делает это так.Вы можете просто оставить его как function trial().Что касается повторения функции, просто поместите имя функции в функцию и вызовите функцию извне следующим образом:

function trial() {
    $("body").keydown(function(e) {
        if (e.which == 81 || e.which == 80)
        {
            $(".message").text("exercise begun (timestamp)");
            var refreshId = setTimeout(timeout, 2000);
        }
    });
    trial();
}
trial();

Однако я не рекомендую этого, потому что это вызовет бесконечный цикл, который может вызвать сбойтаб.

0 голосов
/ 12 августа 2011

trial() запускается автоматически, поскольку находится внутри функции $().$(function(){}) совпадает с $(document).ready(function(){}).

$(function trial(){}); создает функцию с именем trial в своей области действия, а затем запускает ее, когда DOM готов.

Просто объявитеобычно функционируют:

function trial(){
  // Code
}

Или, если вы хотите объявить его, когда DOM готов, вы можете объявить его внутри $() (ПРИМЕЧАНИЕ: trial будет существовать только внутри функции $()):

$(function(){
    function trial(){
      // Code
    }
    trial();
});
trial(); // won't work, it's out of scope
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...