jQuery-函数运行时未被告知,请告知

jQuery-函数运行时未被告知,请告知,jquery,function,Jquery,Function,我正在用jQuery写一个心理学实验。我想写一个函数,当用户按p或q时,它将开始练习。我的工作是: $(function trial() { $("body").keydown(function(e) { if (e.which == 81 || e.which == 80) { $(".message").text("exercise begun (timestamp)"); var refreshId = setTimeout(time

我正在用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>");
}
功能超时(x){
var x=三氮杂铀
$(“.message”).prepend(“超时(试用“+x+”)
”; }
由try()调用的函数本身运行良好,除非被调用,否则它不会运行。我想这和$symbol和“scope”有关吧?谢谢你的帮助


哦!!此外,还有一个问题。我试图创建一个递归jQuery函数,但遇到了很多麻烦。进行函数调用的最佳方法是什么?

这是因为您正在将对它的引用传递到
$()
(aka)中,这是函数的快捷方式,在加载DOM时运行



主题外:顺便说一句,这样做是将函数用作右边的值(如
=
符号右边的某个值)。这使它成为一个函数表达式。因为您已经命名了函数(它是一个),所以它是一个命名函数表达式。从历史上看,它们在各种JavaScript实现中都没有很好地工作。大多数当前浏览器(现在)都还可以,除了IE9之前的IE,它将创建两个完全独立的函数,更多信息如下:

为了回答您的第一个问题,
$(function(){…code…})
$(document.ready(function(){…code…})的jQuery快捷方式
在DOM达到
ready
状态后立即运行

关于你的第二个问题(它确实属于一个单独的问题,但无论如何我会回答):

jQuery中的函数与JavaScript中的函数没有什么不同。命名函数可以使用自己的名称递归调用自己:

function foo(bar, baz)
{
  ...do some stuff...
  if (--bar)
  {
    foo(bar, baz);
  }
}
您必须更具体地说明使用递归函数要实现什么,如果您要这样做,请打开一个关于StackOverflow的单独问题。

trial()
自动运行,因为它位于
$()
函数内
$(function(){})
$(document.ready(function(){})
相同

$(函数试用(){})
在其作用域中创建一个名为
trial
的函数,然后在DOM就绪时运行它

只需正常声明函数:

function trial(){
  // Code
}
或者,如果希望在DOM准备就绪时声明它,可以在
$()
中声明它(注意:
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();

但是,我不建议这样做,因为它会导致一个无限循环,可能会使选项卡崩溃。

$(
);
包围
function-trial(){…}
,在文档准备就绪时调用它。它是
$(document.ready(function-trial(){…});
[]

如果不想这样做,请删除周围的
$(
);
$()
是DOM就绪事件的捷径。它只执行传递给它的函数。要解决它,请使用
$(文档)。就绪
本身:

$(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);
        }
   }
});
请尝试以下操作:

$(function(){
trial = function(){
// Your code here
};
});

我建议,如果你有两个独立的问题,你可以分别问。我也会花一些时间在jquery网站上的api上。他们的文档即使不比msdn好,也和msdn一样好。事实上,jquery文档对于一个开源项目来说是非常好的。我不会把它与msdn比较,因为我不想侮辱他们做jQuery文档的人。@T.J.克劳勒-哎哟,MSDN越来越好了,让我们这么说吧。@John:;-)也许是稍微好一点。让我们说,导航仍然是一场灾难,对于发明ajax和innerHTML的公司来说,它们的实际使用速度惊人地慢,你知道。-1回答一个问题,但提到你不知道为什么。如果你不知道为什么这不是答案,那只是猜测。答案不是
jquery就是这样做的。这是因为它启动了
$(document).ready
选择器是document,操作是.ready.-1,表示“它将导致一个无限循环,可能会使选项卡崩溃”。我确实说过,我不建议使用+1,它清楚地解释了非常好的答案,并且简明扼要。很酷-但是如果我去掉
$()
,如何使用其他jQuery代码,如
$(“body”).keydown
$(“.message”
?如果不使用
$()
,我不明白如何构造标记。只要包含jQuery库,就可以在任何地方使用jQuery代码。你不必做
$(文档)中与jQuery相关的所有事情.ready
。问题是您是否希望文档中包含某些内容。ready?这是只有您才能根据您对系统的了解来回答的问题。我不完全理解。
$()
$(文档)的简写。ready
当我将它包装在函数中时,但当我在
$(“body”)中使用它时,它是jquery.keydown
?这些是相同的事情还是不同的事情?更新:教程都说要在document.ready中执行所有jQuery。当我在document.ready之外放置一个非常简单的jQuery语句时,比如这个:
$(“ul li:nth child(1)”).append(numStim);
,它无法工作。在document.ready中,它像一个符咒一样工作。建议?
$(function(){
trial = function(){
// Your code here
};
});