类型错误 $ 不是一个函数。

4

我在我的网站上使用了一个基于jQuery的记忆游戏。总体而言它运行良好,但是我想要一个“再玩一次”的链接和最后的统计信息。我无法让那段代码工作。我看到了这个错误:

TypeError: $ is not a function
  [Break On This Error]     

    var game = $('div.slashc-memory-game'); // get the game

这里是JS:

    // this script shows how you can get info about the game
    var game = $('div.slashc-memory-game'); // get the game
    var info = $('p#info').find('span'); // get the info box
    var playAgain = $('a#play-again').css('visibility', 'hidden'); // get the play again link
    // format time like hh:mm:ss
    var formatTime = function(s)
    {
        var h = parseInt(s / 3600), m = parseInt((s - h * 3600) / 60); s = s % 60;
        return (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s);
    }
    // listen for game 'done' event 
    game.bind('done', function(e)
    {
        // show basic stats
        var stats = game.slashcMemoryGame('getStats');
        info.html('Success ! Number of clicks : ' + stats.numClicks + ', elapsed time : ' + formatTime(parseInt(stats.time / 1000)) + '.');
        playAgain.css('visibility', 'visible'); // show link
    });
    // play again action
    playAgain.click(function(e)
    {
        playAgain.css('visibility', 'hidden'); // hide link
        info.html('Memory Game, click to reveal images'); // reset text
        game.slashcMemoryGame('restart'); // restart game
        e.preventDefault();
    });

这里有一个Fiddle

1
SyntaxError: missing } after function body - Dr.Molle
设置一个不能模拟实际问题的代码片段没有太多意义。 - Pointy
1
你的网站对我来说运行良好。然而,这个代码片段中充满了复制粘贴错误。 - Eric
1
你的代码运行良好,'再玩一次'链接也是如此 - Chrome 21.0.1180.83 m - wirey00
4个回答

1

尝试将$()替换为jQuery(),看看是否仍然出现此错误。指示它不是函数的错误意味着jQuery文件尚未加载或$名称被有意释放。

如果jQuery()函数不起作用,请确保在脚本块/文件之前加载jQuery文件。


@Lynda:根据你收到的特定错误信息,这意味着在某个地方有东西被赋值给了$,这是一个问题。请寻找$ = ...并进行修复。 - josh3736

1

由于fiddle自动添加了onload函数,所以您的代码实际上是正常工作的:http://jsfiddle.net/ZXMUB/5/

我所做的就是取消注释第一行,其中游戏变量被分配,并从js窗口中删除了关闭</script>标记。

您确定在您的实际网站上,代码是否位于$(document).ready函数(或类似函数)内,并且jQuery库已正确加载?


0

-1
将您的代码包装在一个“ready”函数中,就像这样
$(function(){  

 ...

});

你的代码在 jQuery 加载之前执行了。


4
这没有意义。如果“$”不是一个函数,用另一个无效的“$”调用包装一个无效的调用如何有帮助? - josh3736
我要指出的是,从所有的迹象来看,游戏实际上并没有触发“完成”事件。 - Chris Carew
据我所知,jQuery专门寻找$(function())$(document).ready(function()..)这些内容,并将它们绑定到DOM加载事件上。说实话,我并不知道它是如何实现的。 - Chris Carew
绝对不是。$()只是一个普通的函数调用。如果在调用时 $ 不存在,你将会得到一个错误。jQuery 并不会“寻找”任何东西;没有魔法。如果在脚本执行之前没有加载 jQuery,你就不能调用 jQuery 方法,比如绑定到 documentready 事件上。 - josh3736
我想这很有道理。所以魔法其实就是等待Dom本身完全加载,这在这种情况下不应该是一个“真正”的问题。谢谢澄清,我没有仔细考虑过这个问题。如果你遇到$ undefined错误,我猜检查jQuery并等待是适当的响应。 - Chris Carew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接