Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >jsonp跨域实现的几种方式[js跨域原理]

jsonp跨域实现的几种方式[js跨域原理]

作者头像
Java架构师必看
发布于 2022-02-27 05:33:48
发布于 2022-02-27 05:33:48
3.4K00
代码可运行
举报
文章被收录于专栏:Java架构师必看Java架构师必看
运行总次数:0
代码可运行

项目中常常用到搜索,特别是导航类的网站。自己做关键字搜索不太现实,直接调用百度的是最好的选择。 使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript也可以实现跨域调用js。

jsonp快速入门: 【原创】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 关于jquery.ajax的jsonp方法是用以及其error回调函数不能正确执行,请参考园长dudu的文章: jquery ajax中使用jsonp的限制 jQuery插件jQuery-JSONP使用注意 其他有关jsonp的文章: 利用iframe实现ajax 跨域通信的解决方案

ok,了解了jsonp的原理和应用后,我们看看百度的智能提示是如何做的 在chrome的调试窗口下看看百度搜索发出的请求。当输入关键字“a”,请求如图:

用firebug看下请求的参数,如图:

请求方式:get请求 请求参数:wd明显是要搜索的关键字;cb是请求回来的处理函数,名字可以随便给;t是时间戳,防止缓存的;p不知道什么意思,每次请求都给3就可以了;sid也不知道什么意思,不要也可以请求,如果想要也可以带上,值就是上面截图的值。

请求地址和参数都知道了,于是写下如下js测试是否可以拿到关键字提示(源码里的test.html页面):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var qsData = { 'wd': ‘a’, 'p': '3', 'cb': 'getData', 't': new Date().getMilliseconds().toString() };
     $.ajax({
          async: false,
          url: "http://suggestion.baidu.com/su",
          type: "GET",
          dataType: 'jsonp',
          jsonp: 'jsoncallback',
          data: qsData,
          timeout: 5000,
          success: function (json) {
          },
          error: function (xhr) {
          }
    });

只听到从架构师办公室传来架构君的声音: 纵岫壁千寻,榆钱万叠,难买春留。有谁来对上联或下联?

qsData封装所有请求要发送的参数;getData是自定义的名称,用于处理返回的关键字(以下示例代码把请求回来的关键字打印到了FireBug的控制台):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
此代码由Java架构师必看网-架构君整理
        function getData(data) {
            var Info = data['s'];  //获取异步数据
            console.log(Info);
        }

监控下文本框,实时的发送ajax请求并拿回数据是这样的:

ok,测试可用,的确可以拿到关键字提示。但是总不能把一堆关键字放到前台让用户看,至少得跟百度一样,可以用鼠标和键盘方向键从候选词框里选词吧。 最关键的来了,现在开始写完整的智能提示并配合鼠标和键盘对候选词的操作(源码里的index.html页面),实现如下功能:

  1. 即时监控字母键和数字键,按下就发ajax请求(也可以设置延迟发请求,源码里有);同时监控空格、退格、Delete、Enter等键;
  2. 鼠标移入弹出层高亮选中的行,点击可上屏;
  3. 按键盘上下方向键可以选择候选词,回车提交跳转到百度搜索页面;
  4. 点击页面其他部位自动隐藏弹出框;
  5. 按ESC键隐藏弹出框

监控鼠标和键盘输入的js(autoComplete.js 源码里有更详细的注释):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var timeoutId;   //延迟请求服务器
var highlightindex = -1;   //高亮标记
$(function () {
    $("#searchText").keyup(function (event) {
        var myEvent = event || window.event;
        var keyCode = myEvent.keyCode;
        //console.log(keyCode);

        //监控键盘
        if (keyCode >= 65 && keyCode <= 90 || keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 111 || keyCode >= 186 && keyCode <= 222 || keyCode == 8 || keyCode == 46 || keyCode == 32 || keyCode == 13) {
            //延时操作
            //clearTimeout(timeoutId);
            //timeoutId = setTimeout(function () {
            //            timeoutId = FillUrls();
            //             }, 500)
            FillUrls();  //异步请求
            if (highlightindex != -1) {
                highlightindex = -1;
            }
        }
        else if (keyCode == 38 || keyCode == 40) {
            if (keyCode == 38) {       //向上
                var autoNodes = $("#auto").children("div")
                if (highlightindex != -1) {
                    autoNodes.eq(highlightindex).css("background-color", "white");
                    highlightindex--;
                } else {
                    highlightindex = autoNodes.length - 1;
                }
                if (highlightindex == -1) {
                    highlightindex = autoNodes.length - 1;
                }
                autoNodes.eq(highlightindex).css("background-color", "#ebebeb");
                var comText = autoNodes.eq(highlightindex).text();
                $("#searchText").val(comText);
            }
            if (keyCode == 40) {    //向下
                var autoNodes = $("#auto").children("div")
                if (highlightindex != -1) {
                    autoNodes.eq(highlightindex).css("background-color", "white");
                }
                highlightindex++;
                if (highlightindex == autoNodes.length) {
                    highlightindex = 0;
                }
                autoNodes.eq(highlightindex).css("background-color", "#ebebeb");
                var comText = autoNodes.eq(highlightindex).text();
                $("#searchText").val(comText);
            }
        } else if (keyCode == 13) {     //回车
            if (highlightindex != -1) {
                var comText = $("#auto").hide().children("div").eq(highlightindex).text();
                highlightindex = -1;
                $("#searchText").val(comText);
            } else {
                $("#auto").hide();
                $("#searchText").get(0).blur();
            }
        } else if (keyCode == 27) {    //按下Esc 隐藏弹出层
            if ($("#auto").is(":visible")) {
                $("#auto").hide();
            }
        }
    });

最后实现效果展示。可以鼠标选择候选词也可以键盘方向键选择,点击即可上屏,回车直接跳到百度页面:

源码:点击下载 在线演示地址:点击跳转

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-262,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
简书搜索自动匹配功能
今天周六,我又来分享知识啦。最近一直在忙项目,所以趁着这个周末,喝着咖啡,听着音乐,敲着代码就把做项目的知识点总结给大家,简直不要太惬意,哈哈。
wblearn
2018/08/27
1.7K0
简书搜索自动匹配功能
AJAX培训笔记_js基础笔记
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/04
6.5K0
零基础打造一款属于自己的网页搜索引擎
在说这个之前,想必大家应该都比较了解搜索引擎了,它就是通过用户在浏览器输入框中输入文本,从而显示一些结果,你觉得哪项符合你要搜索的内容,你就点击哪项。
前端皮皮
2020/11/26
2.2K0
零基础打造一款属于自己的网页搜索引擎
bootstrap-suggest插件
这是一个基于 bootstrap 按钮式下拉菜单组件的搜索建议插件,必须使用于按钮式下拉菜单组件上。 示例地址:http://lzw.me/pages/demo/bootstrap-suggest-plugin/demo/ 插件源码:https://github.com/veenter/bootstrap-suggest-plugin
别团等shy哥发育
2023/02/25
11K0
bootstrap-suggest插件
跨域jsonp的原理
因为浏览器的同源策略,那什么是同源策略呢浏览器从A网站向B网站请求资源,必须同时满足三点才可以,协议相同,域名相同,端口相同,任何一点不同都会产生跨域,产生跨域后,浏览器就会阻止数据返回。
挥刀北上
2019/08/06
1.3K0
跨域jsonp的原理
jQuery中发送jsonp
jQuery中发送jsonp 第一种方式 通过$.ajax 常用参数 $.ajax({ url:''//请求地址 datatype:'jsonp'//发送jsonp请求必须指定数据类型为jsonp jsonp:'参数名'//服务器接收回调函数的参数名如callback ,cb等等默认callback jsonpCallback:'回调函数名'//默认jQuery123545_43456。。。。的随机字符串,可以自定义 success:function(){} }) 第
切图仔
2022/09/08
1.3K0
jQuery中发送jsonp
跨域问题
1.跨域简介 Ajax是后台交互,后台与前端交互都是使用ajax,在实际开发中,往往不是后台给php去连接,而是一个API, 但是直接访问API,会出错() eg: $(function(){
天天_哥
2018/09/29
9970
【Ajax进阶】跨域和JSONP的学习
例如,下表给出了相对于http://www.test.com:80/index.html 端口号不写,默认为80.。
坚毅的小解同志的前端社区
2022/11/28
1.2K0
【Ajax进阶】跨域和JSONP的学习
智能搜索框实现思路--源码和流程图详解
我们在浏览各大网站的时候,包括百度、淘宝、京东、雅虎等等网站,当我们输入一个单词或者文字的时候,下面会有一行行待选项供我们选择,很多的公司在做网站的时候也会考虑到这块,那么我们今天就简单的说一下实现的思路,简单的把代码写一下!
何处锦绣不灰堆
2020/05/29
2K0
JSONP原理及使用
首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输。
yaphetsfang
2020/07/30
7730
JSONP原理及使用
day41_jQuery学习笔记_02
下面是jQuery 提供额外的事件,用于完善javascript缺失的事件 详解如下:
黑泽君
2018/10/11
3.9K0
杨老师课堂之Jquery的筛选,事件,效果,Ajax,javascript跨域)
D.closest()获得D所有父元素,含自己(D、B、A)与 D.parents() 对比
杨校
2018/12/06
8.3K0
jquery及原生javascript对jsonp解决跨域问题实例详解
jquery方式 ---- 前端: $.ajax({ url: 'http://m.xxx.tv/goLottery', data: { data: data }, type: 'GET', dataType: 'jsonp', beforeSend: function() { }, success: function(data) {    
smy
2018/04/03
9680
jquery及原生javascript对jsonp解决跨域问题实例详解
【前端基础】javascript笔记
浏览器在加载显示一个网页时,会对页面html代码解析,并在内存中创建一个描述该页面的模型(树形结构)。
fankhu
2023/06/20
1680
利用js实现输入框动态提示信息
摘要总结:本文主要介绍如何使用JavaScript在网页中实现动态提示框效果。通过使用JavaScript中的正则表达式、DOM操作、事件处理等技术,实现根据输入框中的值对下拉提示框的内容进行动态修改,最终展示出精美的提示框效果。
林老师带你学编程
2018/01/03
14.8K0
利用js实现输入框动态提示信息
五、jQuery动效
显示slideDown()动画,隐藏动画slideUp(),切换动画slideToggle()
Dreamy.TZK
2020/06/18
2K0
五、jQuery动效
Ajax:初次认识ajax,ajax使用方法
我们来个简单的测试,使用最原始的HttpServletResponse处理 , .最简单 , 最通用
冷环渊
2021/10/19
5.8K0
JS 跨域问题常见的五种解决方式
要理解跨域问题,就先理解好概念。跨域问题是由于javascript语言安全限制中的同源策略造成的.
书童小二
2018/09/03
1.6K0
JS 跨域问题常见的五种解决方式
Vue实现百度下拉提示搜索一、前期准备二、代码实现三、实现效果
一、前期准备 网上大神已经做过这个功能https://github.com/lavyun/vue-demo-search 这自己仅实现搜索功能 为了使用百度实现搜索功能,首先搞清楚下拉数据和搜
致Great
2018/04/11
3.2K0
Vue实现百度下拉提示搜索一、前期准备二、代码实现三、实现效果
jQuery介绍,一篇就够了!
老猫-Leo
2023/12/11
2180
相关推荐
简书搜索自动匹配功能
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文