Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么下一个函数不执行?_Javascript - Fatal编程技术网

Javascript 为什么下一个函数不执行?

Javascript 为什么下一个函数不执行?,javascript,Javascript,首先我想检查jquery是否存在,然后转到下一个函数。但是没有执行下一个函数abc()。也许有人知道为什么 window.onload = function () { if (window.jQuery) { localStorage.setItem("key", "abc"); } else { script = document.createElement("script"); script.src = "https://ajax.go

首先我想检查jquery是否存在,然后转到下一个函数。但是没有执行下一个函数
abc()
。也许有人知道为什么

  window.onload = function () {
    if (window.jQuery) {
      localStorage.setItem("key", "abc");
    } else {
      script = document.createElement("script");
      script.src = "https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js";
      document.head.appendChild(script);
    }
  };
  function abc() {
    $(document).keypress(function (e) {
      alert(e.key);
    });
  }

该代码存在一些问题。这听起来像是在jQuery加载后要调用
abc
,出于某种原因,您考虑到在运行此代码之前可能已经加载了它,也可能没有加载。我看到的问题是:

  • localStorage
    中设置值不会导致函数运行;事实上,该代码中的任何内容都不会导致运行
    abc
  • 您没有声明
    script
    变量,这意味着代码正落入我所说的陷阱
  • 在加载所有图像和其他辅助项之后,窗口上的
    load
    事件在页面加载过程中发生非常非常晚。通常,最好在
    script
    元素上使用
    type=“module”
    (如果您喜欢使用模块,这很方便),或者设置,或者在关闭
    标记之前,将脚本放在正文的最末端(与旧浏览器兼容)
因此,如果我不得不考虑jQuery加载/未加载的情况,并且我无法使用模块,那么我可能会这样做(请参阅注释):

//如果不使用模块,请使用包装器,以避免创建不必要的全局
(功能(){
//定义初始化函数
函数init(){
$(文档)。按键(功能(e){
警惕(e.key);
});
}
//如果jQuery已加载。。。
if(window.jQuery){
//…初始化
init();
}否则{
//否则,加载它并在加载时初始化
var script=document.createElement(“脚本”);
//  ^^^−−−−−−−−− 防止隐式全局变量的恐怖

script.onload=init;//是否尝试调用该方法?@NikhilGoyal它应该被自动调用代码从不调用
abc
。只有在调用
abc
时才会注册事件处理程序。还要注意,前一位有点奇怪,只有在已经定义了jQuery的情况下才在
localStorage
中设置项…@gergemail9com-通过什么?何时?问题中的任何内容都不会调用它,也不会导致以后调用它。看起来这是一种非常罕见的模式。您添加jquery就是这样。这取决于您添加这些链接的站点结构。您只需初始化abc()函数,但从不调用它。
// Use a wrapper if not using modules, to avoid creating unnecessary globals
(function() {
  // Define your initialization function
  function init() {
    $(document).keypress(function (e) {
      alert(e.key);
    });
  }

  // If jQuery is loaded...
  if (window.jQuery) {
    // ...init
    init();
  } else {
    // Otherwise, load it and init when it's loaded
    var script = document.createElement("script");
//  ^^^−−−−−−−−− prevents the horror of implicit globals
    script.onload = init; // <=== Calls `init` when the script successfully loads
    script.src = "https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js";
    document.head.appendChild(script);
  }
})();