面试题目:动态加载外部JS

这是上次面试的第二题,考察了动态加载外部JS的方法,当时完全不会,回来找了下资料,原来《高性能网站建设进阶指南》里面有说道的,主要是利用script onload方法。

另外,题目里给的checkbox和submit都是没有ID的,还需要遍历。本来有个lastElementChild可以用的,不过好像IE不支持。

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8" content="text/html">
  5.     <title>面试题</title>
  6. </head>
  7. <body>
  8.     <form action="" id="aForm">
  9.         <input type="checkbox" value="a.js">
  10.         <input type="checkbox" value="b.js">
  11.         <input type="checkbox" value="c.js">
  12.         <input type="checkbox" value="d.js">
  13.         <input type="submit" value="提交">
  14.     </form>
  15. <script type="text/javascript">
  16. /*
  17.         // 1.提交表单时按勾选的复选框加载外部JS
  18.         // 2.当所有代码加载完成后alert("Done")
  19.         */
  20. </script>
  21. </body>
  22. </html>
复制代码


题目:
1.提交表单时按勾选的复选框加载外部JS
2.当所有代码加载完成后alert("Done")



我的解决方案:
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8" content="text/html">
    <title>面试题</title>
</head>
<body>
    <form action="" id="aForm">
        <input type="checkbox" value="a.js">
        <input type="checkbox" value="b.js">
        <input type="checkbox" value="c.js">
        <input type="checkbox" value="d.js">
        <input type="submit" value="提交">
    </form>
    <script type="text/javascript">
        /*
        // 1.提交表单时按勾选的复选框加载外部JS
        // 2.当所有代码加载完成后alert("Done")
        */
        var aForm = document.getElementById("aForm");
        var theInputs = aForm.elements;
        var checkedNum = 0;
        var checkedJsSrc = new Array();
        
        //禁止表单自动提交
        aForm.onsubmit = function(){
            return false;
        }
        
        //给提交按钮添加事件
        for(i = 0; i < theInputs.length; i++){
            if(theInputs[i].type == "submit"){
                theInputs[i].onclick = function(){
                    for(j = 0; j < theInputs.length; j++){
                        if(theInputs[j].type == "checkbox" && theInputs[j].checked){
                            checkedNum++;
                            checkedJsSrc.unshift(theInputs[j].value);
                        }
                    }
                    loadJs(checkedNum);
                }
            }
        }        
        
        //输出Done
        function sayDone(){
            alert("Done");
            aForm.submit();
        }
        
        //加载外部JS
        function loadJs(aNum){
            var domScript = document.createElement("script");
            var loadJsNum = aNum;
            domScript.type = "text/javascript";


            if(loadJsNum <= 1){
                domScript.onloadDone = false;
                domScript.src = checkedJsSrc[0];
                domScript.onload = function (){
                    domScript.onloadDone = true;
                    sayDone();
                }
                domScript.onreadystatechange = function(){
                    if(("loaded" === domScript.readyState || "complete" === domScript.readyState) && !domScript.onloadDone){
                        domScript.onloadDone = true;
                        sayDone();
                    }
                }
            }
            else
            {
                domScript.onloadDone = false;
                domScript.src = checkedJsSrc[loadJsNum - 1];
                domScript.onload = function (){
                    domScript.onloadDone = true;
                    loadJs(loadJsNum - 1);
                }
                domScript.onreadystatechange = function(){
                    if(("loaded" === domScript.readyState || "complete" === domScript.readyState) && !domScript.onloadDone){
                        domScript.onloadDone = true;
                        loadJs(loadJsNum - 1);
                    }
                }
            }
            document.getElementsByTagName("head")[0].appendChild(domScript);
        }
    </script>
</body>
</html>
运行代码 复制代码 保存代码 提示:您可以先修改部分代码再运行! power by W3Cfuns.com


外部的JS文件内容分别是:
a.js:
  1. alert("a");
复制代码

b.js:
  1. alert("b");
复制代码

c.js:
  1. alert("c");
复制代码

d.js:
  1. alert("d");
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值