javascript - 我用如下JS代码获取百度搜索下拉框关键字,为什么会时灵时不灵?
大家讲道理
大家讲道理 2017-04-10 15:55:34
[JavaScript讨论组]

麻烦大家帮我看下,如图获取百度搜索热词,在自己站点上显示下拉选项实现搜索。如下代码可以实现,但是会时灵时不灵,尚且不知道是哪里出了问题。

调试时发现,出现问题的时候, jsonp 正常请求没问题。但回调函数不是每次都会按预期的结果正常执行。

测试浏览器 360极速浏览器 极速模式。

在线Demo :http://hxy100.gitcafe.io/gh-demos/baidu-suggest/demo.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>中国微商第一新媒体-微商创业,运营,推广,管理者学习交流平台-商贾之家</title>
    <meta name="description" content="{$SEO['description']}"/>
    <meta name="keywords" content="{$SEO['keyword']}"/>
    <link rel="stylesheet" type="text/css" href="css/swiper3.1.0.min.css"/>
    <link rel="stylesheet" type="text/css" href="css/common_weishang.css"/>
    <script type="text/javascript" src="js/jquery.weishang.js"></script>
    <style type="text/css">
        #sugp{
            z-index: 999;
            background-color: #FAF2F2;
            width:380px;
            position:absolute;
        }

        #sugp ul li {
            height:35px;
            line-height: 35px;
            font-size:16px;
            margin: 0px;
            padding-left: 6px;
            text-align: left;
            white-space:nowrap;
        }
        #sugp ul li:hover{
            background-color: #D5F2DE;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <p class="header">
        <p class="header_inner">
            <img src="images/logo.png" alt="商贾之家-微商第一新媒体"/>
            <p class="left_search">
                <p>
                    <form action="http://www.baidu.com/s?wd=" method="get" target="_blank">
                        <a class="js_setHome sethome g_red" onclick="window.SetHome(this,'')" href="" hidefocus="true">设为首页</a>
                        <span>|</span>
                        <a href="{APP_PATH}/tougao.html" target="_blank">我要投稿</a>
                        <input type="hidden" value="67063059_pg" name="tn"/>
                        <p><input id="searchwd" name="wd" type="text" value=""/> <button onclick="$(this).closest('form').submit()">百度一下</button></p>
                    </form>
                    <p id="sugp" style="">
                        <ul>                
                        </ul>
                    </p>

                    <script type="text/javascript">

                        function getBDJson(jsondata){
                            var sugp =$('#sugp'),html="";
                            var suges=jsondata['s'];
                            if(suges.length==0){
                                $(sugp).hide();
                                return;
                            }
                            $(sugp).hide().children('ul').empty();
                            for (var i = 0; i < suges.length; i++) {
                                html+='<li onclick="BDsearch(this)">'+ suges[i]+'</li>';
                            }
                            $(sugp).children('ul').html(html);
                            $(sugp).css('top',$('#searchwd').offset().top+$('#searchwd').height()+'px').css('left',$('#searchwd').offset().left+'px');
                            $(sugp).css('display','block').show();
                            return jsondata;
                        }

                        function BDsearch(obj) {
                            var wd = $(obj).text();
                            $('#sugp').hide();
                            $('#searchwd').val(wd).closest('form').submit();
                        }


                        $('#searchwd').keyup(function(){
                            if($(this).val()==""){
                                $('#sugp').hide();
                                return true;
                            }
                            var word = $(this).val();
                            $.ajax({
                                type : "get",
                                async:false,
                                url : "http://suggestion.baidu.com/su?",
                                dataType : "jsonp",
                                jsonp: "callbackparam",
                                jsonpCallback:"getBDJson",
                                data:{
                                    wd:word,
                                    cb:"getBDJson"
                                },
                                success : function(json){
                                },
                                error:function(){}
                            });
                        });

                        $(document).click(function(event) {
                            if($('#sugp').is(':visible')){
                                $('#sugp').hide();
                            }
                        });
                    </script>
                </p>
            </p>
        </p>
    </p>
</body>
</html>
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
PHP中文网

问题是在两次紧接着的DOM操作间会产生一个race condition,在前一次DOM完成之前下一次紧接着开始了。

$(sugp).hide().children('ul').empty(); - 1
$(sugp).children('ul').html(html); - 2

最简单的优化是去掉第1句,剩第二句,就没有race condition了。

但是这样设计还有缺陷,应该考虑对keyup的handler进行debounce,并且把getDBJson调用重构成异步执行_.defer或者_.delay,这样更新列表对敲击键盘的体验的影响可以减到最小。

秘技的DOM操作应该用尽可能快的调用,比如用document.getElementById替代$('#..'),用.innerHTML=...替代.html(...),应该避免不必要的hide()调用。

黄舟

我就想知道你是怎么绕过跨域的……

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号