【问题标题】:Async Javascript Uncaught TypeError: Object has no method 'test'Async Javascript Uncaught TypeError: Object has no method 'test'
【发布时间】:2013-01-30 16:08:21
【问题描述】:

我正在尝试创建我的第一个异步加载的 javascript 文件,但之后无法从对象调用函数。下面是我的示例 javascript 文件 exampletest.js...

(function(){
    var example = {
        test : function () {
            alert("test function called");
        }
    };
    window.example = example;
})();

然后我尝试使用以下代码调用此文件。

    (function(doc, example) {
            window.example = example;

            var script = doc.createElement("script");
            script.type = "text/javascript";
            script.async = true;
            script.src = "http://www.example.com/exampletest.js";

            var scriptTag = doc.getElementsByTagName("script")[0];
            scriptTag.parentNode.insertBefore(script, scriptTag);
    })(document, window.example || []);

    example.test();

当我运行这个脚本时,我收到错误“Uncaught TypeError: Object has no method 'test'”

如果我在页面加载后调用该方法,比如单击链接,则测试方法被正确调用,并且我得到了我的警告框。

我一直在四处寻找,试图更好地理解这一点,但到目前为止都没有运气。我试图更好地理解如何在没有方法“测试”的情况下调用函数。有没有办法在 javascript 加载后推送函数调用,而不会破坏调用本身,使其保持为 example.test();?

【问题讨论】:

标签: javascript asynchronous


【解决方案1】:

在调用之前检查函数是否存在。

试试这个:

if (typeof example.test == function){
    example.test();
}

注意:由于 JavaScript 是异步加载的,window.onload 将不起作用。

更新

拥有async 的全部目的是在不等待脚本加载的情况下加载页面。你不能两者兼得。

这行不通

<script src="exampletest.js"  async ></script>

<script type="text/javascript">
    example.test();
</script>

但这会起作用,因为执行会等待文件加载

<script src="exampletest.js" ></script>

<script type="text/javascript">
    example.test();
</script>

【讨论】:

  • 有办法解决这个问题吗?我想要它,所以我可以调用 example.test();无需将其专门放在 window.onload 中。从长远来看,我想给用户一个脚本,以便他们可以将其剪切并粘贴到他们的站点中,然后毫无问题地调用方法。
  • 有没有办法通过在我的脚本文件中检查这种类型的东西来解决这个问题?我正在尝试拥有它,以便安装我的 js 的客户端只需要调用 example.test() 或我拥有的任何其他方法调用。我从其他安装了复制/粘贴脚本的公司(如 Google Analytics)那里看到了类似的情况,但我无法弄清楚他们是如何处理这个问题的。
  • 另一种选择是让您的脚本同步加载。
  • @user2023918 Google Analytics 在 HTML 页面中没有调用任何函数。所有调用都发生在加载的脚本中。另外,他们不做async
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多