以下代码不起作用
<input id="inp" type="text"
onfocus="(function(){document.getElementById('inp').style.background="yellow";})">
但是这段代码可以正常工作
<input id="inp" type="text"
onfocus="(function(e){document.getElementById('inp').style.background ='yellow';}(this)">
为什么第一个代码不起作用?
答案 0 :(得分:0)
第一个不起作用,因为它包含在括号中,因此它是一个函数&#34;表达式&#34;而不是函数&#34;声明&#34;。表达式意味着&#34;评估&#34;,因此当您的元素获得焦点时,表达式将被计算,但不会被调用。此外,您有双引号嵌套在双引号内,这将导致语法错误("yellow"
)。那些需要改为单引号。
第二个是有效的,因为&#34;表达&#34;由第二组括号(this)
立即调用。
但是,应该避免使用这两种语法。不要使用内联HTML事件属性来连接事件处理回调函数,因为它们:
this
绑定
功能相反,请在JavaScript中编写事件处理程序:
// Get a reference to the DOM element
var input = document.getElementById("inp");
// Wire up an event handler
input.addEventListener("focus", function(e){
input.style.background ='yellow';
});
&#13;
<input id="inp" type="text">
&#13;
答案 1 :(得分:0)
问题是你没有调用第一个函数。从本质上讲,你是在声明一个函数但从不调用它。
示例:
(function() {
console.log('I would do something but no one calls me');
}); // <-- Notice the lack of ()
(function() {
console.log('I do something because I am called');
})(); // <-- Notice the () on the end
&#13;
由于您在函数中使用了双引号("
),因此在第一个示例中也遇到了问题。由于onfocus
属性值必须用双引号括起来,因此您过早地关闭了该属性。
<input onfocus="console.log("I won't work since I'm closing the quotes");" />
答案 2 :(得分:0)
第一个因为以下原因而无法正常工作:
IIFE语法类似于(function(){}())
,黄色周围的"
正在关闭onfocus。
修正后的语法是这样的。
<input id="inp" type="text"
onfocus="(function(){document.getElementById('inp').style.background='yellow';})()">
答案 3 :(得分:0)
<input id="inp" type="text"
onfocus="(function(e){document.getElementById('inp').style.background ='yellow';}(this)">
应该是:
<input id="inp" type="text" onfocus="(function(that) {that.style.background='yellow'})(this);">
没有必要使用document.getElemetnsById方法,因为您已经将“this”元素传递给自调用函数。
但是像Scott已经提到过你应该使用DOM Event Standard,通过HTLM属性处理evetns是老派。