You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET中跨JS文件调用函数出现undefined错误的问题

解决page2.js调用page1.js函数出现undefined的问题

我碰到过好几个做ASP.NET+jQuery开发的朋友遇到这种情况,调用其他JS文件里的函数报undefined,大概率是下面几个原因,咱们一步步排查解决:

1. 最常见的:JS文件加载顺序搞反了

如果你的aspx页面里,page2.js的<script>标签写在了page1.js前面,那浏览器会先加载执行page2.js,这时候page1.js里的Page1Func还没被定义,自然就会报undefined。

解决办法:确保page1.js的引入在page2.js之前,比如正确的顺序应该是:

<script src="<%= SomeCommonFunc.GetResolvedUrl("~/Page1.js") %>" type="text/javascript"></script>
<script src="<%= SomeCommonFunc.GetResolvedUrl("~/Page2.js") %>" type="text/javascript"></script>

2. Page1Func的作用域被限制了

要是你在page1.js里把Page1Func定义在了局部作用域里(比如用自执行函数包裹),那外部的page2.js根本访问不到这个函数。

比如page1.js里如果是这么写的,就会出问题:

// 局部作用域包裹,函数只在内部可见
(function() {
    function Page1Func() {
        // 你的函数逻辑
    }
})();

解决办法:把函数暴露到全局作用域,有两种常用方式:

  • 直接全局声明函数:
function Page1Func() {
    // 你的函数逻辑
}
  • 挂载到window对象上:
(function() {
    function Page1Func() {
        // 你的函数逻辑
    }
    // 暴露到全局
    window.Page1Func = Page1Func;
})();

3. 异步加载属性导致顺序混乱

如果你的<script>标签加了async或者defer属性,浏览器会异步加载这些JS文件,哪怕你写对了顺序,也可能出现page2.js先执行的情况。

解决办法

  • 如果不需要异步加载,直接去掉async/defer属性,让JS同步加载;
  • 如果必须用异步,那可以通过动态加载的方式,确保page1.js加载完成后再加载page2.js:
// 先加载page1.js,加载完成后再加载page2.js
const script1 = document.createElement('script');
script1.src = '<%= SomeCommonFunc.GetResolvedUrl("~/Page1.js") %>';
script1.onload = function() {
    const script2 = document.createElement('script');
    script2.src = '<%= SomeCommonFunc.GetResolvedUrl("~/Page2.js") %>';
    document.head.appendChild(script2);
};
document.head.appendChild(script1);

4. Page1.js根本没加载成功

有时候看起来路径写对了,但实际浏览器请求不到page1.js,比如路径解析错误导致404。

排查办法
打开浏览器开发者工具(按F12),切换到Network标签,刷新页面,看page1.js的请求状态:

  • 如果是404,说明SomeCommonFunc.GetResolvedUrl生成的路径有问题,你可以查看页面渲染后的源码,看<script>src属性是不是正确的URL,调整路径直到能正常加载。

5. jQuery ready事件的坑

如果page1.js里把Page1Func定义在了$(document).ready()的回调里,那这个函数只在ready回调内部可见,外部的page2.js同样访问不到。

比如page1.js里不要这么写:

$(document).ready(function() {
    // 函数被限制在ready回调内部
    function Page1Func() {
        // ...
    }
});

解决办法:把函数定义移到ready回调外面,或者挂载到window上,确保全局可见。

内容的提问来源于stack exchange,提问作者Shreya Singh

火山引擎 最新活动