onclick属性没有找到全局函数

时间:2014-01-18 19:35:11

标签: javascript jquery html

我通过onlick事件添加了div,但是点击了一个错误(Mozilla Firefox):“ReferenceError:myfoo未定义”。如果我将onclick事件更改为警报,它可以正常工作,但不能使用mysefl编写的函数。

这是jsfiddle

http://jsfiddle.net/UJ85S/5/

function myfoo(x)
{
    alert(x);
}

$("#some").html('<div id="cool_div" onclick="myfoo('+"'xwe'"+');"></div>');

请你解释一下是什么问题? (我明白可以分配.click事件,但是可以通过onclick吗?)。

2 个答案:

答案 0 :(得分:3)

真正需要做的是不要让jsFiddle将它包装在onload事件中,因为它使用了一个创建新范围的函数。然后,您的功能无法在此新范围之外访问。了解正在发生的事情,不学习如何绕过它(即不仅仅是将代码破解到窗口对象):

http://jsfiddle.net/UJ85S/12/

No wrap - in <body>

答案 1 :(得分:2)

这种情况正在发生,因为您在myfoo函数内定义了$(window).load(function () {...})(JSFIDDLE会这样做):

  

您需要声明一个全局函数。您可以window.myfoo来声明您的功能。

window.myfoo = function (x)
{
    alert(x);
}

JSFIDDLE

但是, polute 全局范围并不是一个好习惯,这就是为什么最好使用$(...).on("click", function () { alert(...) })处理程序。

我不鼓励在HTML中使用on...属性,因为it's also another bad practice

您的代码变为:

function myfoo (x)
{
    alert(x);
}

var $divToAppend = $("<div id='cool_div'>")
$divToAppend.on("click", function () {
    myfoo("hello");
});

$("#some").html($divToAppend);

这里是DEMO