Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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_Asynchronous - Fatal编程技术网

Javascript 异步脚本不可访问

Javascript 异步脚本不可访问,javascript,asynchronous,Javascript,Asynchronous,我正在加载一个异步创建的脚本,以帮助防止网站速度减慢。我无法调用class.track({“some_param”:“some_data”}),因为它还不可用。如何实现异步加载并能够调用类 下面是加载js的代码,它发生在结束body标记之前,并且在它下面调用Class.track <script type="text/javascript"> (function() { function async_load(){ var api_i

我正在加载一个异步创建的脚本,以帮助防止网站速度减慢。我无法调用class.track({“some_param”:“some_data”}),因为它还不可用。如何实现异步加载并能够调用类

下面是加载js的代码,它发生在结束body标记之前,并且在它下面调用Class.track

<script type="text/javascript">

    (function() {
        function async_load(){
            var api_id = "XXXXXXXXX";
            var s = document.createElement('script');
            s.type = 'text/javascript';
            s.async = true;
            s.src = 'https://site.com/script.js?id=' + api_id;
            var x = document.getElementsByTagName('script')[0];
            x.parentNode.insertBefore(s, x);
         }
    if (window.attachEvent)
        window.attachEvent('onload', async_load);
    else
        window.addEventListener('load', async_load, false);
    })();

    Class.track("page_view", {"page":"plans"});
</script>

(功能(){
函数异步加载(){
var api_id=“XXXXXXXXX”;
var s=document.createElement('script');
s、 类型='text/javascript';
s、 异步=真;
s、 src='1〕https://site.com/script.js?id=“+api_id;
var x=document.getElementsByTagName('script')[0];
x、 parentNode.insertBefore(s,x);
}
如果(窗口附件)
attachEvent('onload',async\u load);
其他的
addEventListener('load',async\u load,false);
})();
track(“page_view”,{“page”:“plans”});
编辑

采纳了Dan的评论和TJ的答案,并决定对其进行修改,下面是我的想法,希望这能帮助其他人

<script type="text/javascript">
    var _Class = new function(){
        var items = [];

        this.track = function(type, params){
            params = params || {};
            items.push({"type":type, "params":params});
        }

        this.get = function(){
            return items;
        }

    };

    var Class = _Class;

    (function() {
        function async_load(){
            var api_id = "XXXXXXXXX";
            var s = document.createElement('script');
            s.type = 'text/javascript';
            s.async = true;
            s.src = 'https://site.com/script.js?id=' + api_id;
            s.onload = function(){
                var items = _Class.get();
                Class.trackBatch(items);
            };
            var x = document.getElementsByTagName('script')[0];
            x.parentNode.insertBefore(s, x);
         }
    if (window.attachEvent)
        window.attachEvent('onload', async_load);
    else
        window.addEventListener('load', async_load, false);
    })();

    Class.track("page_view", {"page":"plans"});
</script>

var_Class=新函数(){
var项目=[];
this.track=函数(类型、参数){
params=params |{};
push({“type”:type,“params”:params});
}
this.get=函数(){
退货项目;
}
};
var类=_类;
(功能(){
函数异步加载(){
var api_id=“XXXXXXXXX”;
var s=document.createElement('script');
s、 类型='text/javascript';
s、 异步=真;
s、 src='1〕https://site.com/script.js?id=“+api_id;
s、 onload=函数(){
var items=_Class.get();
类别.轨道批次(项目);
};
var x=document.getElementsByTagName('script')[0];
x、 parentNode.insertBefore(s,x);
}
如果(窗口附件)
attachEvent('onload',async\u load);
其他的
addEventListener('load',async\u load,false);
})();
track(“page_view”,{“page”:“plans”});

在当前所有主要浏览器中,可以使用
脚本
元素的
onload

s.onload = function() {
    /* ...this is called when the script is loaded, so `Class` should
       be available...
    */
    Class.track("page_view", {"page":"plans"});
};
在旧版本的IE中,您必须改用
onreadystatechange
,并检查元素的
readyState
属性是否为字符串
“complete”


当然,您也可以使用
setTimeout
setInterval
轮询您创建的全局符号(
Class
,在您的情况下,我怀疑),例如
如果(typeof Class==“undefined”){/*…在几毫秒内安排另一个检查…*/}

谢谢您的帮助,如果我加载脚本并尝试在整个页面的任何位置调用Class.track(),这是否是最好的方法?@BrianPutt:我不太清楚你的意思。使用
onload
onreadystatechange
在旧版IE上)是了解脚本何时加载的最佳方法。轮询也是一种选择,但往往需要更多的延迟时间。为了复制google analytics的工作方式,您可以加载GA代码,然后可以在整个页面的任何位置使用GA.track(),希望这是有意义的,因为我对JS World还相当陌生,如果您异步加载代码,你不能指望它被加载到任何地方,除了加载回调或从中调用的东西。好的,我想我会结合你的答案和Dandavis的评论。将创建一个小版本的类来跟踪数据,并在数据被替换之前对其进行处理。我感谢你的帮助!你可以制作一个假的Class.track来记录传入的呼叫,直到真正的呼叫出现,只需确保在关闭窗口之前抓取呼叫。Class。。。就个人而言,我更喜欢在自动执行函数中进行轮询,该函数将返回setTimeout(arguments.callee);如果self.Class是falsy…@dandavis谢谢,我实际上是在用你说的+TJ的答案。我使用的不是setTimeout,而是onload。很酷的东西!