Javascript - 使用createElement函数调用js文件时无法识别函数

时间:2014-09-09 08:26:48

标签: javascript

我的编码如下:

<script language="javascript" src="test.js"></script>
<script language="javascript">

    mp.init({
    app_id  : 'hd32y4328r3meh2423em',
    version : '1.0'
    });

</script>

test.js 里面这样:

var mp = {};
    mp.init = function(vars) {
        var obj = Object.create(vars); // create obj
        console.log(obj); // all
        alert(obj);
        //return obj;
    };

mp.init函数()在使用createElement加载 test.js 时无法识别,如下代码:

<script language="javascript">
    // Load the JS asynchronously       
    (function() {
        var s = document.createElement('script');
        s.type = 'text/javascript'; s.src = 'mpsdk.js';
        var x = document.getElementsByTagName('script')[0];
        x.parentNode.insertBefore(s, x);
    })();


    // We have a simple cars object     
    mp.init({
    app_id  : 'hd32y4328r3meh2423em',
    version : '1.0'
    });

</script>

任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:1)

加载脚本后调用函数

试试这个 -

function() {
        var s = document.createElement('script');
        s.type = 'text/javascript'; s.src = 'mpsdk.js';
        s.addEventListener('load', function(){
        //script loaded do stuff here
         // We have a simple cars object     
         mp.init({
         app_id  : 'hd32y4328r3meh2423em',
         version : '1.0'
         });
        });
        var x = document.getElementsByTagName('script')[0];
        x.parentNode.insertBefore(s, x);
    })();

或 在加载时使用回调函数。

     var onLoadScript = function(callback) {
        var s = document.createElement('script');
        s.type = 'text/javascript'; s.src = 'mpsdk.js';
        s.addEventListener('load',callback);//callback on load

        var x = document.getElementsByTagName('script')[0];
        x.parentNode.insertBefore(s, x);
     };
onLoadScript(function(e){
        //script loaded do stuff here
         // We have a simple cars object     
         mp.init({
         app_id  : 'hd32y4328r3meh2423em',
         version : '1.0'
         });
};

答案 1 :(得分:0)

这是因为您正在执行代码同步,而脚本是异步加载。因此,当您调用mp.init时,脚本尚未加载。

您必须先监听load事件(针对IE9 +和标准浏览器)或readystatechange事件(针对IE8-)检查readyState === "complete",然后调用mp.init

但我建议你使用众多AMD加载器中的一个(RequireJS,curl,...),甚至是jQuery的$.getScript来节省所有麻烦。