javascript - 为什么我的事件处理程序会导致 "is not a function"错误,但可以从 Firebug 控制台运行?

标签 javascript jquery

使用 JQuery 1.2.6,从 Firefox 3 和 IE7 进行测试。我有一些非常基本的 JavaScript 来重新加载验证码图像。在我的 JS 文件中,我有:

var Captcha = {
    count: 0,

    Refresh: function(){
        // Concatenate "count" to force a URL change, which forces the browser to reload the image
        $('#Captcha').attr('src', 'Captcha.aspx?' + Captcha.count);
        Captcha.count++;
    }
}

我的链接如下所示:

<a href="javascript:void(0);" id="ChangeCaptcha" onclick="Captcha.Refresh();">Try a different image</a>

当我点击链接时,出现 JavaScript 错误。在 Firefox 的 Firebug 插件中,它说“Captcha.Refresh”不是一个函数。因此,我在同一个窗口中转到我的 Firebug 控制台,然后键入

Captcha

然后我在响应行中得到一个“对象”(正如预期的那样)。然后我输入

Captcah.Refresh

然后我在响应行中得到一个 function()(如预期的那样)。然后我输入

Captcha.Refresh()

然后它执行函数,更新我的验证码图像,一切都很好。如果我返回并再次尝试链接,它仍然不起作用。如果我在控制台中输入 Capcha.Refresh() 而没有点击链接,它也可以正常工作。我到底想念什么?显然 JS 正在加载,但为什么该函数调用不起作用?

最佳答案

出现问题是因为您有一个 ID 为 Captcha 的元素,以及一个同名的全局变量。 IE 传统上为每个 id 属性引入一个全局变量。 FF 不......但假装它在某些情况下与 IE 兼容。在这种情况下,click 处理程序将验证码视为一个元素,而不是您的对象。

解决方法:

更改 Captcha 元素的 id。

或者,将全局对象的名称更改为 Captcha 以外的名称。

或者,使用 Pim Jager's technique将处理程序的解释移动到全局验证码变量已被您自己的变量覆盖的上下文中。

或者,将您的 onclick 属性更改为:

onclick="window.Captcha.Refresh();"

...这将在已被全局变量替换的上下文中强制查找 Captcha 属性。

(所有这些都在 IE6 和 FF3 中测试过 - 我推荐 Pim Jager 的回答)

关于javascript - 为什么我的事件处理程序会导致 "is not a function"错误,但可以从 Firebug 控制台运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/533817/

相关文章:

javascript - 用 Ajax 响应替换 DOM 节点

javascript - 多个不同的 Javascript 错误无法复制

javascript - javascript 如何以如此准确的方式打印 0.1?

jquery - 每 15 秒复制一次 div 并为其添加动画

Javascript 条件返回语句(简写 if-else 语句)

JavaScript - 在 JS 对象内操作 HTMLElements

jquery - 有没有办法在 safari(网络浏览器)上隐藏 iPad 键盘

javascript - 仅在 onkeyevent 上启用退格键?

jquery - knockout observableArray 推送不起作用

jquery - 如何判断 jquery ui 对话框查询是否已初始化?