我正在用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函数,并且遇到了很多麻烦。什么是使函数调用的最佳方法?
答案 0 :(得分:10)
这是因为您将对它的引用传递给$()
(又名jQuery()
),这是ready
函数的快捷方式,并在加载DOM时运行。
偏离主题:BTW,通过这样做,您将该功能用作右手值(就像在右侧的东西一样) =
签名)。这使它成为函数表达式。由于您已将该函数命名为(good thing to do),因此它是名为的函数表达式。这些在历史上在各种JavaScript实现中都不能很好地工作。大多数当前的浏览器(现在)都可以,除了IE9之前的IE,它将创建两个完全独立的功能,更多信息在这里:Double take
答案 1 :(得分:3)
将function trial() { ... }
与$(
和);
包围在一起,您就可以在文档准备就绪时调用它。这是$(document).ready(function trial() { ... });
[API Ref]
如果您不想这样做,请移除周围的$(
和);
。
答案 2 :(得分:2)
要回答您的第一个问题,$(function(){...code...})
是$(document).ready(function(){...code...});
的jQuery快捷方式,只要DOM达到ready
状态就会运行。
关于你的第二个问题(它确实属于关于SO的单独问题,但无论如何我都会回答):
jQuery中的函数与JavaScript中的函数没有什么不同。命名函数可以使用自己的名称递归调用自己:
function foo(bar, baz)
{
...do some stuff...
if (--bar)
{
foo(bar, baz);
}
}
你必须更具体地说明你想用递归函数实现什么,如果你打算这样做,请在StackOverflow上打开一个单独的问题。
答案 3 :(得分:0)
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
答案 4 :(得分:0)
$()
是DOM ready事件的捷径。它只是执行传递给它的函数。要解决此问题,请使用$(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);
}
}
});
答案 5 :(得分:0)
尝试以下方法:
$(function(){
trial = function(){
// Your code here
};
});
答案 6 :(得分:-1)
尝试这样做:$(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();
但是,我不建议这样做,因为它会导致无效循环,导致标签崩溃。