jsonp跨域写淘宝搜索联想词(原生js)

Posted zhuzixi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jsonp跨域写淘宝搜索联想词(原生js)相关的知识,希望对你有一定的参考价值。

一、主体

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 
  4 <head>
  5 <meta charset="UTF-8">
  6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7 <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8 <title>Document</title>
  9 <style>
 10 * {
 11 padding: 0px;
 12 margin: 0px;
 13 list-style: none;
 14 text-decoration-line: none;
 15 }
 16 
 17 input {
 18 position: relative;
 19 top: 200px;
 20 left: 200px;
 21 width: 400px;
 22 height: 28px;
 23 border: 2px solid #f40;
 24 border-top-left-radius: 28px;
 25 border-bottom-left-radius: 28px;
 26 text-indent: 1em;
 27 outline: none;
 28 }
 29 
 30 .search {
 31 position: absolute;
 32 top: 200px;
 33 left: 604px;
 34 width: 80px;
 35 height: 28px;
 36 line-height: 28px;
 37 text-align: center;
 38 border: 2px solid #f40;
 39 color: #fff;
 40 background-color: #f40;
 41 cursor: pointer;
 42 }
 43 
 44 .box {
 45 position: absolute;
 46 top: 232px;
 47 left: 200px;
 48 width: 400px;
 49 
 50 border: 2px solid #ccc;
 51 background: #fff;
 52 display: none;
 53 }
 54 
 55 li {
 56 cursor: pointer;
 57 }
 58 
 59 li:hover {
 60 background-color: #ccc;
 61 }
 62 
 63 .box li a {
 64 display: block;
 65 
 66 width: 100%;
 67 height: 100%;
 68 color: black;
 69 font-size: 14px;
 70 padding-left: 1em;
 71 margin-top: 3px;
 72 }
 73 
 74 .search a {
 75 display: block;
 76 width: 100%;
 77 height: 100%;
 78 font-size: 16px;
 79 color: #fff;
 80 }
 81 </style>
 82 </head>
 83 
 84 <body>
 85 <input type="text" style="color:#666" value="女士化妆品" placeholder="请输入要搜索的商品">
 86 <div class="search">
 87 <a href="#">搜 索</a>
 88 </div>
 89 <div class="box"></div>
 90 <script>
 91 var oInput = document.getElementsByTagName(‘input‘)[0];
 92 var search = document.getElementsByTagName(‘div‘)[0];
 93 var box = document.getElementsByTagName(‘div‘)[1];
 94 var A = document.querySelector(‘.search a‘);
 95 var selfA = A,
 96 selfInput = oInput,
 97 selfBox = box;
 98 //跨域1——监听input框内值的变化,通过跨域函数及时获取服务器资源
 99 selfInput.oninput = crossDomain;
100 //跨域函数
101 function crossDomain(){
102 var oScript = document.createElement(‘script‘);
103 oScript.src = ‘https://suggest.taobao.com/sug?code=utf-8&q=‘ + this.value + ‘&callback=jsonp1‘;
104 document.body.appendChild(oScript);
105 document.body.removeChild(oScript);
106 }
107 
108 function jsonp1(data) {
109 var s = ‘‘;
110 var str = data.result;
111 if (str.length > 0) {
112 //要用加载的资源长度来判断,而不能用box框的innerHTML或innerText
113 //因为,box的结构和内容要比实时资源慢一点。
114 str.forEach(function (ele, index) {
115 s = s + ‘<li><a href = https://s.taobao.com/search?initiative_id=tbindexz_20170306&amp;q=‘ +
116 ele[0] + ‘>‘ + ele[0] + ‘</a></li>‘;
117 });
118 selfBox.innerHTML = s;
119 selfBox.style.display = ‘block‘;
120 } else {
121 selfBox.style.display = ‘none‘;
122 }
123 selfBox.onclick = function (e) {
124 //此处的跨域也是通过路径2,也是a标签跨域。
125 selfInput.value = e.target.innerText;
126 }
127 //方法1,加定时器延迟时间
128 selfInput.onblur = function () {
129 //这个地方解决的问题是:只要input框值是空,当鼠标离焦的时候,就把值变为‘女士化妆品‘
130 //并且此时聚焦又可以出发新的onfocus,但是显得多此一举,用户体验不好,因为一直出现‘女士化妆品‘,有点流氓,
131 //不过默认值可以随机变的话,就画龙点睛了。
132 // if (this.value == ‘‘) {
133 // this.value = ‘女士化妆品‘;
134 // selfInput.onfocus = crossDomain;
135 // }
136 setTimeout(function () {
137 selfBox.style.display = ‘none‘;
138 }, 100)
139 }
140 //方法2,a标签和click事件都需要鼠标点下+抬起,没有blur事件快
141 //但是mousedown事件比blur事件快,但是无法触发a标签。
142 // selfInput.onblur = function(){
143 // selfBox.style.display = ‘none‘;
144 // }
145 selfInput.onfocus = function () {
146 if (str.length > 0) {
147 selfBox.style.display = ‘block‘;
148 }
149 }
150 }
151 //跨域2——input框的默认值是“女士化妆品”,此时鼠标聚焦也需要跨域,因为此时input框内的值没有发生变化;
152 //需要注意的是,一旦触发了跨域1,里面新的onfocus会替换该onfocus,至此,该onfocus就不会再触发。
153 selfInput.onfocus = crossDomain;
154 //点击a标签搜索商品,也跨域,不过是通过跨域路径2,超链接的路径。
155 selfA.onclick = function (e) {
156 this.href = ‘https://s.taobao.com/search?initiative_id=tbindexz_20170306&amp;q=‘ + oInput.value;
157 }
158 </script>
159 </body>
160 
161 </html>
二、问题
1.input标签内,不是style内置属性,不能用style获取,比如input.value、input.placeholder
2.selfBox框内的内容要比实时的input框值,以及获取的资源值,慢一点点。所以用资源值的长度来监听更加准确,从而才能及时消除box框
3.两个不同路径的跨域,一个input框内值的变化及时跨域获取资源,二是a标签跨域到新的页面,需要获取新的页面的URL。
该项目中两种不同的路径跨域都有两处使用,分别是input值的变化——路径1,当input默认值是“化妆品”,不要变化的时候,onfocus聚焦需要跨域——路径1;
当box中的每个li下的a标签直接链接到各自的页面时,需要跨域得到各自的页面URL——路径2 ;当点击“搜索”时,需要a标签获取input框内的值,拼接成新的url
超链接到新的页面需要跨域——路径2
4.定位时,position、top、left,同级块元素跟文档之间的定位是以border为标准。
5.画半圆的方法需要熟悉。
6.jsonp跨域:创建script标签——script.src获取资源——将script标签插入到body中——将script标签从body中删除——回调函数的使用
7.跨域的方式:(1)flash(2)服务器代理中转(3)document.domain:将基础域名相同的设置在需要相互访问的页面的脚本中(4)jsonp跨域。

以上是关于jsonp跨域写淘宝搜索联想词(原生js)的主要内容,如果未能解决你的问题,请参考以下文章

计算机网络之JSONP跨域

原生的js实现jsonp的跨域封装

百度搜索关键词联想API JSONP使用实例

原生JS简单封装JSONP跨域获取数据

原生js实现简单JSONP

原生JS封装Ajax插件(同域&&jsonp跨域)