JavaScript onclick处理程序在引号中给出不同的行为?

JavaScript onclick处理程序在引号中给出不同的行为?,javascript,Javascript,我在今天编写一些演示代码时注意到了这种奇怪的行为,我很好奇到底发生了什么。按钮不起作用,尽管按钮2起作用,尽管它们的设置方式不同。我知道这和引用有关,但我很好奇为什么会这样。类似地,如果我用引号将函数传递给按钮3,而不是直接附加到按钮4,则按钮4可以工作,但按钮3不能 另外,我认为如果按钮2可以工作,它将立即对console.logtest进行评估,类似于它在没有引号的情况下的工作方式,但它会延迟到实际单击按钮为止。我知道这不是最好的方法,但出于好奇,我很好奇这里到底发生了什么 documen

我在今天编写一些演示代码时注意到了这种奇怪的行为,我很好奇到底发生了什么。按钮不起作用,尽管按钮2起作用,尽管它们的设置方式不同。我知道这和引用有关,但我很好奇为什么会这样。类似地,如果我用引号将函数传递给按钮3,而不是直接附加到按钮4,则按钮4可以工作,但按钮3不能

另外,我认为如果按钮2可以工作,它将立即对console.logtest进行评估,类似于它在没有引号的情况下的工作方式,但它会延迟到实际单击按钮为止。我知道这不是最好的方法,但出于好奇,我很好奇这里到底发生了什么

document.getElementByIdapp.innerHTML=` 测试沙箱 按钮 按钮2 按钮3 按钮4 `; document.getElementByIdhello.onclick='console.logtest'; document.getElementByIdhello4.onclick=e=>console.logtest; 沙箱 当您分配给onclick时,您将调用一个setter,这与使用分配的表达式调用addEventListener非常相似。但如果传递的表达式不是函数,则addEventListener和onclick都将以静默方式失败:

document.getElementByIdapp.innerHTML=` 测试沙箱 按钮 `; document.getElementByIdhello.onclick='console.logtest'; //与以下内容几乎相同: document.getElementByIdhello.addEventListener'click'、'console.logtest'; 当您分配给onclick时,您将调用一个setter,这与使用分配的表达式调用addEventListener非常相似。但如果传递的表达式不是函数,则addEventListener和onclick都将以静默方式失败:

document.getElementByIdapp.innerHTML=` 测试沙箱 按钮 `; document.getElementByIdhello.onclick='console.logtest'; //与以下内容几乎相同: document.getElementByIdhello.addEventListener'click'、'console.logtest'; 为什么按钮二起作用

可以将一个动作与一定数量的事件关联起来 当用户与用户代理交互时发生。每个 上面列出的内部事件接受一个脚本值。这个 每当该元素的事件发生时,就会执行脚本。这个 脚本数据的语法取决于脚本语言

因此,每当用户进行交互时,都会调用onclick=script[CT],在本例中,这是一个鼠标单击事件

为什么按钮不工作

document.getElementByIdhello.onclick需要一个函数,当您传递字符串时,为什么按钮2起作用

可以将一个动作与一定数量的事件关联起来 当用户与用户代理交互时发生。每个 上面列出的内部事件接受一个脚本值。这个 每当该元素的事件发生时,就会执行脚本。这个 脚本数据的语法取决于脚本语言

因此,每当用户进行交互时,都会调用onclick=script[CT],在本例中,这是一个鼠标单击事件

为什么按钮不工作


document.getElementByIdhello.onclick需要一个函数,当您传递字符串时,

document.getElementByIdhello.onclick需要一个函数,而您正在赋值string@CodeManiac,当然有道理,但按逻辑按钮2不应该工作。这两个是不同的上下文,一个是HTML,另一个是JS,为什么您认为两者应该相同,分配给html内部onClick=的值被视为脚本,并且由于console.log是有效的脚本,所以它会给您testdocument.getElementByIdhello.onClick需要一个函数,而您正在分配string@CodeManiac,当然有道理,这两个是不同的上下文,一个是HTML,另一个是JS,为什么您认为两者应该是相同的,分配给onClick=inside HTML的值被认为是脚本,并且由于console.log是有效的脚本,所以它给您测试谢谢您的响应!这肯定回答了我关于3和4的问题。现在关于按钮和按钮2,我仍然不确定为什么内联onclick处理程序将字符串强制转换为函数,但是通过执行getElementId并以这种方式设置onclick会产生不同的结果。另外,如果onclick='console.loghello'被强制为一个函数,那么它会立即求值。我当然同意,在实践中我永远不会这样做,但我正试图更好地理解JS在hood下所做的事情。HTML属性基本上都是字符串,可能不带引号,如果它们只包含特定的几个字符,没有空格,但通过编程指定给onclick,在Javascript中-如答案的第一部分所述,不涉及属性调用setter,通过Javascript添加侦听器需要传递函数如果要更接近地模拟onclick属性,请使用setAttri
但是,使用内联处理程序,它没有将调用setterYeah的onclick属性赋值,而是执行类似于new Function或eval的操作,将属性字符串转换为JS Function。如果它实际上将属性转换为持久函数,我不确定该过程是什么,或者它是否只是在单击时计算包含的代码感谢您的响应!这肯定回答了我关于3和4的问题。现在关于按钮和按钮2,我仍然不确定为什么内联onclick处理程序将字符串强制转换为函数,但是通过执行getElementId并以这种方式设置onclick会产生不同的结果。另外,如果onclick='console.loghello'被强制为一个函数,那么它会立即求值。我当然同意,在实践中我永远不会这样做,但我正试图更好地理解JS在hood下所做的事情。HTML属性基本上都是字符串,可能不带引号,如果它们只包含特定的几个字符,没有空格,但通过编程指定给onclick,在Javascript中-如答案的第一部分所述,没有涉及的属性调用setter,通过Javascript添加侦听器需要传递函数。如果要更接近地模拟onclick属性,请使用setAttribute,而不是分配给将调用setterYeah的onclick属性,对于内联处理程序,它会执行类似于new Function或eval的操作,将属性字符串转换为JS Function。我不确定该过程到底是什么,它是否真的将属性转换为持久函数,或者单击时是否只计算包含的代码