我最近在学习JavaScript而且还不了解一些东西。在这个例子中,我想要一个带有两个事件监听器的按钮,但不能同时执行。就是这样:
网页有两个元素:一个段落(<p>
)和一个按钮。此按钮应移除<p>
元素,并在交替点击时恢复该元素。
1.- Add an event listener to the button (remove).
|--- Remove the <p> element.
|--- Remove the <p> element
|--- Remove the listener and add a new event listener (restore).
2.- With the new event listener (restore), the button restore the <p> element.
|--- Remove the event listener (restore)
|--- Add a new event listener (remove);
3.- Back to 1.
我可以将事件监听器分配给按钮,但我无法将其删除。按钮具有remove事件后,将永远不会删除此事件,并且永远不会添加新事件。为什么会这样?如果我错了,请告诉我更好的代码实践。
以下是jsfiddle中的代码:http://goo.gl/4CX55g
非常感谢。
答案 0 :(得分:3)
以下几行不符合您的预期:
boton.removeEventListener('click', this.remover, false);
boton.addEventListener('click', this.restaurar, false);
boton.removeEventListener('click', this.restaurar, false);
boton.AddEventListener('click', this.remover, false);
此处的this
变量不指向定义函数的Pagina
对象。它指向调用remover
或restaurar
函数的对象。您可以通过添加alert(this);
电话进行检查。此示例中的对象是HTML按钮元素。
您可以通过在that = this;
的分配下创建一个新变量boton
来解决此问题。然后,在方法中使用that
而不是this
。
另外,您输错了:AddEventListener
应为addEventListener
。
检查fixed JSFiddle。另外,this SO question提供了很多有关this
的详细信息。
答案 1 :(得分:0)
问题在于您的功能范围。您需要在每个函数调用之外设置对this
的引用。
答案 2 :(得分:0)
但是如果你想要隐藏和展示一个段落,你就可以走很远的路了......
<script>
document.getElementById("btn-remover").onclick=function(){
var el = document.getElementById("publicacion-texto");
if(el.style.display=="none"){
el.style.display="block";
this.innerHTML="Haz click aquí para remover el texto";
} else {
el.style.display="none";
this.innerHTML="Haz click aquí para restaurar el texto";
}
}
</script>