函数写成立即执行函数或放到其他函数内部,就执行失败

本人在做一个导航首页,做搜索时,想用百度搜索智能提示功能,遇到了一个奇怪的问题。代码如下:

<body>
    <input type="text" id="q">
    <ul id="show"></ul>
    <script>
        function solve(data) { //得到百度API返回的数据
            var Show = document.getElementById('show');
            var html = "";

            if (data.s.length) {
                Show.style.display = 'block';
                var len = data.s.length;
                for (var i = 0; i < len; i++) { //逐条显示
                    html += '<li><a target="_blank" href="http://www.baidu.com/s?wd=' + data.s[i] + '">' + data.s[i] + '</a></li>';
                }
                Show.innerHTML = html;
            } else {
                Show.style.display = "none";
            }
        }

        var oQ = document.getElementById('q'),
            Show = document.getElementById('show');

        oQ.onkeyup = function() { //当有键盘事件的时候
            if (this.value != "") {
                var oScript = document.createElement("script"); //创建一个script标签,准备引入资源
                oScript.src = 'http://suggestion.baidu.com/su?wd=' + this.value + '&cb=solve';
                document.body.appendChild(oScript);
            } else {
                Show.style.display = "none";
            }
        }
    </script>
</body>

当前代码可执行,可以运行出正确结果。但是当我将其放到其他函数内部,就执行失败。
代码如下:

<body>
    <input type="text" id="q">
    <ul id="show"></ul>
    <script>
        (function() {
            function solve(data) { //得到百度API返回的数据
                var Show = document.getElementById('show');
                var html = "";

                if (data.s.length) {
                    Show.style.display = 'block';
                    var len = data.s.length;
                    for (var i = 0; i < len; i++) { //逐条显示
                        html += '<li><a target="_blank" href="http://www.baidu.com/s?wd=' + data.s[i] + '">' + data.s[i] + '</a></li>';
                    }
                    Show.innerHTML = html;
                } else {
                    Show.style.display = "none";
                }
            }

            var oQ = document.getElementById('q'),
                Show = document.getElementById('show');

            oQ.onkeyup = function() { //当有键盘事件的时候
                if (this.value != "") {
                    var oScript = document.createElement("script"); //创建一个script标签,准备引入资源
                    oScript.src = 'http://suggestion.baidu.com/su?wd=' + this.value + '&cb=solve';
                    document.body.appendChild(oScript);
                } else {
                    Show.style.display = "none";
                }
            }
        })()
    </script>
</body>

有大神知道原因吗?

阅读 2.1k
1 个回答

走在路上,突然想到了这是什么问题。。

var oScript = document.createElement("script"); 
oScript.src = 'http://suggestion.baidu.com/su?wd=' + this.value + '&cb=solve';
document.body.appendChild(oScript);

script在标签插入DOM中才向baidu请求数据,请求到数据,会调用solve回调函数,但当前全局作用域中没有solve函数,所以会执行失败。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题