在jQuery $(document).ready内部触发一个函数?

4smxwvx5  于 2023-02-18  发布在  jQuery
关注(0)|答案(2)|浏览(103)

一直在谷歌上寻找这个/最佳实践的答案。
假设你的大部分javascript都在$(document).ready()中,不管出于什么原因,在那里你有一个函数,你想根据一些外部javascript函数“触发”。
最好的方法是什么?简单地将函数移到全局空间并不完全可行,因为$(document).ready()中包含了所有变量和内容
在这个例子中,外部javascript发出 AJAX 请求,当请求完成时,data get加载到页面上,然后我希望当外部javascript ajax完成时,能够在$(document).ready()内部触发该函数,但是我不能简单地调用该函数,因为它不在全局空间中。

uelo1irk

uelo1irk1#

你可以使用setter来强制转换:

let ready = false
const observe = {}
function run(name, ...args) {
  if (observe[name]) observe[name](...args)
  else {
    let fn
    Object.defineProperty(observe, name, {
      get() {
        return fn
      },
      set(fnL) {
        fn = fnL
        fnL(...args)
      }
    })
  }
}
function set(name, fn) {
  observe[name] = fn
}

$(document).ready(() => {
  ready = true

  const textEl = $("#text")

  function setText(text) {
    textEl.text(text)
  }

  set('setText', setText)
})

run('setText', 'first run')

setTimeout(() => run('setText', 'delayed 2s'), 2000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="text">no thing</div>

如果你在$().ready完成之前调用函数,它将等待直到$().ready运行。如果$().ready已经运行,它也将调用函数

用法

$().ready中,您必须调用set('<function name>', <function>),当您要调用函数时,请运行run('<function name>', ...<argumentts> )
或者更简单的方法是删除$().ready,然后在<body>的末尾键入<script>,这样就可以了

vc9ivgsu

vc9ivgsu2#

如果您不想公开一个全局变量,那么您可以创建一个代码必须触发的事件,该事件将在事件完成时发出通知。

$(function () {
  function myLocalFunction (e, data) {
    console.log('called', data);
  }

  $(document).on("loadedTheStuff", myLocalFunction);

});

window.setTimeout(function () {
   $(document).trigger("loadedTheStuff", "Hello!");
}, 300);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

相关问题