【问题标题】:Javascript function being executed even if its not calledJavascript 函数即使没有被调用也会被执行
【发布时间】:2018-06-21 02:18:43
【问题描述】:

您好,我对 javascript 还很陌生,现在我正在尝试定义函数和隐藏/显示特定元素。

在我制作的这个简单程序中,我试图在函数仍在执行时显示加载屏幕。问题是,即使不点击按钮,onlick 事件处理程序中的函数也会执行

<body>
<button id="thisbutton" type="button">clickme</button>
<div>
    <p> The download will begin in <span id="countdowntimer">10 </span> Seconds</p>
</div>
<div id="loadss" class="LockOn"></div>

<script>

    document.getElementById("thisbutton").onclick(meow());
    document.onload = rawr();
        function rawr() {
        document.getElementById("loadss").style.visibility = "hidden";
        document.getElementById("loadss").style.display = "none";
        }

        function meow() {
            document.getElementById("loadss").style.visibility = "visible";
            document.getElementById("loadss").style.display = "block";
            time();
            document.getElementById("loadss").style.visibility = "hidden";
            document.getElementById("loadss").style.display = "none";
        };
        function time() {
            var timeleft = 10;
            var downloadTimer = setInterval(function () {
                timeleft--;
                document.getElementById("countdowntimer").textContent = timeleft;
                if (timeleft <= 0)
                    clearInterval(downloadTimer);
            }, 1000);
        }
</script>

【问题讨论】:

  • 功能喵正在被调用??
  • 是的,它确实调用了该函数
  • 如果你在函数后面使用括号(),不管它是在点击事件中,它都会被调用。你也可以使用没有名字的函数,或者不用在 JavaScript 中单独声明它。 code document.getElementById("thisbutton").onclick(function(){ document.getElementById("loadss").style.visibility = "visible"; document.getElementById("loadss").style.display = "block "; time(); document.getElementById("loadss").style.visibility = "hidden"; document.getElementById("loadss").style.display = "none"; }); code

标签: javascript html


【解决方案1】:

在 Javascript 中,函数是 first-class citizens。这意味着您可以像对待大多数变量一样对待它们:

function test () { console.log('Hi!'); }

var x = test;

您可以通过在对它们的任何引用上使用括号来执行它们:

test(); // will execute function test
x(); // will _also_ execute function test

因此,您的代码:

document.getElementById("thisbutton").onclick(meow());
document.onload = rawr();

正在执行函数meow 和rawr。您可能希望将引用传递到这些函数:

document.getElementById("thisbutton").onclick(meow);
document.onload = rawr;

【讨论】:

  • 感谢您对引用和方法调用的简明回答。现在据我了解,比在 document.onload 上,它必须调用文档完成加载时引用的函数。我将函数 rawr 引用到 document.onload 但在页面加载后不执行它。 (虽然用 rawr() 调用会执行它,但我相信这是处理这个问题的一种非常便宜的方法)
  • 问题在于您注册事件处理程序的方式。这很难解释/理解;试试看这个:stackoverflow.com/a/9274530/1136527
  • 优先使用addEventListener,而不是基于属性/属性的事件,例如onclick 和onload。例如:document.addEventListener("DOMContentLoaded", meow) 或 document.addEventListener(myDiv, 'click', meow)
  • 另外,如果您错过了@CertainPerformance 的评论,onload 不是一个函数,而是一个属性 - 因此.onload(meow) 应该是.onload = meow - 虽然我会完全避免使用 onload。
  • 我没有错过@certainPerformance 的评论并附上了他的回答。感谢您进一步解释您的答案并为我提供更多阅读材料。不过我还有另一个问题,但我想在回答主要问题时创建一个新问题会更好
【解决方案2】:

你的代码

document.getElementById("thisbutton").onclick(meow());

应该像下面这样

document.getElementById("thisbutton").onclick = meow;

注意我没有调用meow 函数并且onclick 不是一个函数而是一个属性。

还有你的代码

document.onload = rawr;

应该是

document.onload = rawr;

当你使用括号时,函数就会被调用。

【讨论】:

  • 为什么要投反对票?告诉我,我可以改进它。
  • onclick 不是一个函数(最初),它是一个可以赋值的属性。
  • @CertainPerformance 是的,是的,我纠正了这个错误。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 2017-10-19
  • 2021-12-31
  • 2022-12-09
  • 2018-02-09
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多