2016-08-05 113 views
1

嗨,我是新来的JavaScript。这是我的代码。 我想要做的是当有人点击页面中的任何地方。 将打开一个新窗口,但我希望只发生一次,因此当有人再次点击正文时,该函数不应该运行。 有什么建议吗?没有jQuery,请如何使onclick事件只能工作一次

<!DOCTYPE html> 
<html> 

<body onclick="myFunction()> 

<script> 

    function myFunction() { 

     window.open("http://www.w3schools.com"); 

    } 

    </script> 

</body> 

</html> 
+0

尝试拥有全局JavaScript变量。让这个值最初是错误的。在打开窗口之前,检查这个变量的值。只有当这个变量的值为假时才打开窗口。一旦你打开窗口,将其设置为true。 –

+0

使用全局变量 – shadowfox

+0

1:全局布尔变量,2:运行myFunction时删除onclick事件,3:...不能想到第三个选项 –

回答

2

一个简短的解决方案:

<body onclick="myFunction(); this.onclick=null;"> 

一下:

<button onclick="myFunction(); this.onclick=null;">This button works only once</button> 
 
<button onclick="myFunction()">This button works always</button> 
 

 
<script> 
 

 
    function myFunction() { 
 
     console.log("hello"); 
 
    } 
 

 
</script> 
 

 
</body>

+0

简单而有效。即使在像IE这样的老式浏览器上它也能工作吗? – F3L1X79

2

有几种方法可以做到这一点。

1.将事件侦听器添加到脚本的正文中,然后单击删除。

<!DOCTYPE html> 
<html> 
<body> 
<script> 
    document.body.addEventListener('click', myFunction); 
    function myFunction() { 
     window.open("http://www.w3schools.com"); 
     document.body.removeEventListener('click', myFunction); 
    } 
    </script> 
</body> 
</html> 

2.有一个标志来检查函数是否已被调用。

<!DOCTYPE html> 
<html> 
<body onclick="myFunction()"> 
<script> 
    var isBodyClicked = false; 
    function myFunction() { 
     if(isBodyClicked === false){ 
     window.open("http://www.w3schools.com"); 
     document.body.removeEventListener('click', myFunction); 
     } 
     isBodyClicked = true; 
    } 
    </script> 
</body> 
</html> 
2

的下方采用了IIFE创建一个封闭持有布尔变量,避免填充全局命名空间,明确的附加功能,全局对象window并检查它是否是第一次的功能被激发

function(){ 
    var firstTime = true; 
    window.myFunction = function() { 
     if (firstTime){ 
      firstTime = false; 
      window.open("http://www.w3schools.com"); 
     } 
    } 
}()