在另一个 js 文件中调用 JavaScript 函数

IT技术 javascript html
2021-01-15 19:17:51

我想调用在second.js文件中的first.js文件中定义的函数这两个文件都定义在一个 HTML 文件中,例如:

<script type="text/javascript" src="first.js"></script>
<script type="text/javascript" src="second.js"></script>

我想调用中fn1()定义first.jssecond.js. 从我的搜索结果来看,如果first.js首先定义它是可能的,但是从我的测试中我还没有找到任何方法来做到这一点。

这是我的代码:

second.js

document.getElementById("btn").onclick = function() {
    fn1();
}

first.js

function fn1() {
    alert("external fn clicked");
}
6个回答

一个函数不能被调用,除非它是在同一个文件中定义的,或者是在尝试调用它之前加载的。

一个函数不能被调用,除非它与试图调用它的作用域处于相同或更大的范围内。

fn1在 first.js 中声明函数,然后在第二个你可以拥有fn1();

1.js:

function fn1 () {
    alert();
}

2.js:

fn1();

索引.html:

<script type="text/javascript" src="1.js"></script>
<script type="text/javascript" src="2.js"></script>
如果它不起作用,为什么这是 82 票被接受的答案?
2021-03-14 19:17:51
如果这对您不起作用,那么您很可能在其他东西中定义了该函数。例如,我在一个$(document).ready(function() {...})块中使用了我的函数,但它不起作用。我移动了它,它就像一个魅力。
2021-03-19 19:17:51
这对我不起作用。给出未定义 fn1() 的错误
2021-03-22 19:17:51
这对我也不起作用。除了使用 jquery getscript 因为它暗示了一种不好的做法之外,还有什么解决方法吗?
2021-03-25 19:17:51
那么在生产应用程序中管理所有这些的最佳方法是什么?
2021-04-05 19:17:51

第一个JS:

function fn(){
   alert("Hello! Uncle Namaste...Chalo Kaaam ki Baat p Aate h...");
}

第二个JS:

$.getscript("url or name of 1st Js File",function(){
fn();
});
我想你的意思 jQuery.getScript()
2021-03-12 19:17:51
@Pmpr,美元符号是jQuery.
2021-03-31 19:17:51
为什么我在 fn 未知的typescript中收到相同的错误?
2021-04-11 19:17:51

您可以将函数设为全局变量first.js 并查看闭包 ,不要将其document.ready放入外部

你也可以使用ajax

    $.ajax({
      url: "url to script",
      dataType: "script",
      success: success
    });

同样的方式你可以使用jquery getScript

$.getScript( "ajax/test.js" )
  .done(function( script, textStatus ) {
    console.log( textStatus );
  })
  .fail(function( jqxhr, settings, exception ) {
    $( "div.log" ).text( "Triggered ajaxError handler." );
});
初学者永远不要尝试做这样的事情。这些都是要避免的不良做法。只要网页引用了两者,就可以。您只需调用函数,就好像它们在同一个 JS 文件中一样。
2021-03-24 19:17:51
唯一的问题是,由于某种原因,它不包含标题。
2021-04-09 19:17:51

您可以考虑使用 es6 导入导出语法。在文件 1 中;

export function f1() {...}

然后在文件 2 中;

import { f1 } from "./file1.js";
f1();

请注意,这仅在您使用时有效 <script src="./file2.js" type="module">

如果您这样做,您将不需要两个脚本标签。您只需要主脚本,然后就可以在那里导入所有其他内容。

使用 Safari,我得到 cross-origin script load denied by cross-origin resource sharing policy
2021-03-14 19:17:51
对于较旧的浏览器,您可能无法使用 es6 导入语法。如果 Babel 对你来说更容易,你可以使用它。
2021-03-19 19:17:51
如何(导出和)导入整个内容file1.js
2021-03-22 19:17:51

使用窗口在全局范围内声明函数

第一个.js

window.fn1 = function fn1() {
    alert("external fn clicked");
}

第二个.js

document.getElementById("btn").onclick = function() {
   fn1();
}

包括这样

<script type="text/javascript" src="first.js"></script>
<script type="text/javascript" src="second.js"></script>
这是推荐的吗?如果我有 1000 个函数会怎样。我想要做的是有一个 JavaScript 文件来保存所有事件侦听器。但是为了使这项工作正常工作,我必须按照您的建议在全局范围内声明每个函数。这不会减慢速度吗?
2021-03-12 19:17:51