2011-09-26 102 views
1

它为什么不起作用?是否可以注册这样的事件处理程序?

<body> 
    <p id="element_id"> 
     blah 
    </p> 


</body> 




var pcontent = document.getElementById('element_id').innerHTML; 

function exit(){ 

document.getElementById('id2').innerHTML = pcontent; 

} 

var a = '<div id="id2"><input type="button" value="exit" onclick= "exit()"></div>' ; 


document.getElementById('element_id').innerHTML= a; 

http://jsfiddle.net/B94kx/

+0

什么是你想?你能解释一下吗? – denolk

回答

0

这里的问题不是你的代码,而是你在jsfiddle上运行代码的方式。您的小提琴具有onLoad选项集,这意味着所有JavaScript代码都在onLoad回调中运行。所以exit函数在回调中定义,而不是在全局范围内。因此事件处理程序不能引用exit

这个问题可以通过简单地移除onLoad选项,而不是使用no wrap (body)

工作小提琴:http://jsfiddle.net/NjbVh/

或者交替,你可以通过它连接到window强制exit是一个全球性的。

window.exit = function() { 
    document.getElementById('id2').innerHTML = pcontent; 
} 
1

的问题是,该功能exit不是全局函数。 onclick="exit()"尝试运行称为exit的全局函数,该函数不存在。您在事件处理函数的作用域中定义了该函数(它是窗口的onLoad事件,您可以从左侧的面板中看到)。

简单的解决方案是通过将其设定为窗口对象的属性来定义函数为全局值:

window.exit = function() { 
    document.getElementById('id2').innerHTML = pcontent; 
}; 

Updated fiddle


一个更好的解决方案将是停止滥用DOM使用innerHTML和内联事件处理程序。这有点笨重,但是here's your code using proper DOM methods

0

你正在失去你的范围,使得出口()不可见
这里有一个快速和肮脏的解决方案:

var pcontent = document.getElementById('element_id').innerHTML; 

window.exit = function() { 
    document.getElementById('id2').innerHTML = pcontent; 
} 

var a = '<div id="id2"><input type="button" value="exit" onclick="window.exit()"></div>' ; 

document.getElementById('element_id').innerHTML= a; 
相关问题