2014-01-18 40 views
1

我在onlick事件中添加div,但点击出现错误(Mozilla Firefox):“ReferenceError:myfoo未定义”。如果我将onclick事件更改为提醒,它可以正常工作,但不能用mysefl写入的函数。onclick属性找不到全局函数

这里的jsfiddle

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

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

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

你能不能,请解释一下什么是错的? (我明白,可以assign.click事件,但它可以通过onclick?)。

+0

为什么你用'“+‘‘XWE’’+”',为什么不只是'xwe'' – Felix

+0

'xwe'会产生下一个代码:onclick =“myfoo(xwe)”,其中xwe没有定义 – Tigran

+0

我的意思是'onclick =“myfoo('xwe')”',它是否一样作为你的? – Felix

回答

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

+1

不错的一个;):) :)你能解释一下发生了什么 –

+0

这是jsfiddle需要的原因是因为它在[closure]中执行(https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Guide/Closures),这意味着myfoo()不在全局范围内。 – jedifans

+1

@susheel看我的编辑。 :-) –

2

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

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

No wrap - in <body>