听他们说h五的history改良ajax列表请求体验,ajax完毕的无绳电话机一定

因爱人供给,在此之前看了下关于h5的无绳电话机一向,近日写了个demo在此间贴出来,感兴趣的爱侣能够看一下。

遵照h伍 ajax达成手提式有线电话机一定(demo),h5ajax

因相爱的人供给,从前看了下关于h五的手提式无线话机平素,近期写了个demo在此处贴出来,感兴趣的爱人能够看一下。

时下的本子只是demo,仍有多少个难题亟待健全一下,难点如下:

1,怎么样将经纬度等数码发送到被一定人看不到的页面上。

二,怎么着绕过或或威迫让张开链接的人同意使用固定(弹窗)。

3,如今或取经纬度后,要自行用谷歌(谷歌(Google))地球去解析用户地点(通过卫星地形图定位并显示),怎样简化这一片段,让被定位者的中纬度自动生成地图图片并同步导入到其余页面(由此可知不可能让被定位者察觉自身被固定的这一实际)。

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-">
<meta name="viewport" content="width=device-width, initial-scale=, maximum-scale=">
<title>demo..</title>
<script type="text/javascript" src="http://libs.useso.com/js/jquery/../jquery.min.js"></script>
<style type="text/css">
.demo{width:px; margin:px auto px auto}
.geo{margin-top:px}
.demo p{line-height:px; font-size:px}
.demo p span,#baidu_geo,#google_geo{font-weight:bold}
</style>
</head>
<body>
<div id="main">
 <div class="demo">
  <p>地理坐标:</p>
  <div class="geo">
   <p>百度地图定位位置:</p>
   <p id="baidu_geo"></p>
  </div>
  <div class="geo">
   <p>GOOGLE地图定位位置:</p>
   <p id="google_geo"></p>
  </div>
 </div>
</div>
<script>
function getLocation(){
 if (navigator.geolocation){
  navigator.geolocation.getCurrentPosition(showPosition,showError);
 }else{
  alert("浏览器不支持地理定位。");
 }
}
function showPosition(position){
 $("#latlon").html("<br />纬度:"+position.coords.latitude +'<br />经度:'+ position.coords.longitude);
 var latlon = position.coords.latitude+','+position.coords.longitude;
 //baidu
 var url = "http://api.map.baidu.com/geocoder/v/?ak=Cbdaebdbbbabceb&callback=renderReverse&location="+latlon+"&output=json&pois=";
 $.ajax({ 
  type: "GET", 
  dataType: "jsonp", 
  url: url,
  beforeSend: function(){
   $("#baidu_geo").html('正在定位...');
  },
  success: function (json) { 
   if(json.status==){
    $("#baidu_geo").html(json.result.formatted_address);
   }
  },
  error: function (XMLHttpRequest, textStatus, errorThrown) { 
   $("#baidu_geo").html(latlon+"地址位置获取失败"); 
  }
 });
 //google
 var url = 'http://maps.google.cn/maps/api/geocode/json?latlng='+latlon+'&language=CN';
 $.ajax({ 
  type: "GET",
  url: url, 
  beforeSend: function(){
   $("#google_geo").html('正在定位...');
  },
  success: function (json) { 
   if(json.status=='OK'){
    var results = json.results;
    $.each(results,function(index,array){
     if(index==){
     $("#google_geo").html(array['formatted_address']);
     }
    });
   }
  },
  error: function (XMLHttpRequest, textStatus, errorThrown) { 
   $("#google_geo").html(latlon+"地址位置获取失败"); 
  } 
 });
}
function showError(error){
 switch(error.code) {
  case error.PERMISSION_DENIED:
   alert("定位失败,用户拒绝请求地理定位");
   break;
  case error.POSITION_UNAVAILABLE:
   alert("定位失败,位置信息是不可用");
   break;
  case error.TIMEOUT:
   alert("定位失败,请求获取用户位置超时");
   break;
  case error.UNKNOWN_ERROR:
   alert("定位失败,定位系统失效");
   break;
 }
}
getLocation();
</script>
</body>
</html>

澳门葡京 ,以上代码正是达成h5和ajax手提式有线电话机定位代码,后续还会随处更新完善,请我们持续关心帮客之家网址。

ajax完结手提式有线电话机定位(demo),h伍ajax
因情侣要求,在此以前看了下关于h5的无绳电话机定位,方今写了个demo在此处贴出来,感兴趣的恋人能够看一下。…

依据h伍+ajax完毕的无绳电电话机平昔,h5ajax实现稳固

因朋友需求,在此之前看了下有关h伍的无绳电话机一定,近日写了个demo在那边贴出来,感兴趣的相恋的人能够看一下。

当前的本子只是demo,仍有多少个难题亟需宏观一下,问题如下:

听他们说h五的history改良ajax列表请求体验,ajax完毕的无绳电话机一定。壹,如何将经纬度等数码发送到被一定人看不到的页面上。

2,怎样绕过或或勒迫让展开链接的人同意使用固定(弹窗)。

三,近来或取经纬度后,要自行用谷歌地球去分析用户地方(通过卫星地形图定位并呈现),怎样简化那1有的,让被定位者的经纬度自动生成地图图片并一起导入到别的页面(不问可见不能够让被定位者察觉自身被固定的这一实际)。

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>demo..</title>
<script type="text/javascript" src="http://libs.useso.com/js/jquery/1.7.2/jquery.min.js"></script>
<style type="text/css">
.demo{width:560px; margin:60px auto 10px auto}
.geo{margin-top:20px}
.demo p{line-height:32px; font-size:16px}
.demo p span,#baidu_geo,#google_geo{font-weight:bold}
</style>
</head>
<body>
<div id="main">
    <div class="demo">
        <p>地理坐标:</p>
        <div class="geo">
            <p>百度地图定位位置:</p>
            <p id="baidu_geo"></p>
        </div>
        <div class="geo">
            <p>GOOGLE地图定位位置:</p>
            <p id="google_geo"></p>
        </div>
    </div>
</div>
<script>
function getLocation(){
    if (navigator.geolocation){
        navigator.geolocation.getCurrentPosition(showPosition,showError);
    }else{
        alert("浏览器不支持地理定位。");
    }
}

function showPosition(position){
    $("#latlon").html("<br />纬度:"+position.coords.latitude +'<br />经度:'+ position.coords.longitude);
    var latlon = position.coords.latitude+','+position.coords.longitude;

    //baidu
    var url = "http://api.map.baidu.com/geocoder/v2/?ak=C93b5178d7a8ebdb830b9b557abce78b&callback=renderReverse&location="+latlon+"&output=json&pois=0";
    $.ajax({ 
        type: "GET", 
        dataType: "jsonp", 
        url: url,
        beforeSend: function(){
            $("#baidu_geo").html('正在定位...');
        },
        success: function (json) { 
            if(json.status==0){
                $("#baidu_geo").html(json.result.formatted_address);
            }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) { 
            $("#baidu_geo").html(latlon+"地址位置获取失败"); 
        }
    });

    //google
    var url = 'http://maps.google.cn/maps/api/geocode/json?latlng='+latlon+'&language=CN';
    $.ajax({ 
        type: "GET",
        url: url, 
        beforeSend: function(){
            $("#google_geo").html('正在定位...');
        },
        success: function (json) { 
            if(json.status=='OK'){
                var results = json.results;
                $.each(results,function(index,array){
                    if(index==0){
                    $("#google_geo").html(array['formatted_address']);
                    }
                });
            }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) { 
            $("#google_geo").html(latlon+"地址位置获取失败"); 
        } 
    });
}

function showError(error){
    switch(error.code) {
        case error.PERMISSION_DENIED:
            alert("定位失败,用户拒绝请求地理定位");
            break;
        case error.POSITION_UNAVAILABLE:
            alert("定位失败,位置信息是不可用");
            break;
        case error.TIMEOUT:
            alert("定位失败,请求获取用户位置超时");
            break;
        case error.UNKNOWN_ERROR:
            alert("定位失败,定位系统失效");
            break;
    }
}

getLocation();
</script>
</body>
</html>

 

因朋友须要,在此之前看了下有关h5的无绳电电话机一定,近日写了个demo在此地贴出来,感兴趣的爱人能够看…

音讯相比较丰硕的网址一般会以分页显示,在点“下一页”时,诸多网址都施用了动态请求的章程,制止页面刷新。纵然我们都以ajax,可是从局地小的细节仍是能够区分优劣。三个小的底细是能无法援助浏览器“后退”和“前进“键。本文切磋三种艺术,让浏览器能够倒退和发展,也许说让ajax就像是重定向到新页面同样具有能够回来到上壹页或然发展到下1页。

时下的本子只是demo,仍有多少个难题亟待全面一下,难题如下:

     
数据达成分页呈现,最简便的做法是在网站前边加五个page的当数,点“下一页”时,让网页重定向到page+1的新鸿基土地资金财产方。比如博客园的信息网正是如此做的,通过转移网站实现:index_1、index_2、index_三……。但是一旦这么些列表并不是页面包车型地铁关键性部分,也许页面包车型大巴任何一些有众多
图片等丰裕成分,譬如导航是叁个非常大的slider,再选取这样的点子,整个页面会闪烁得厉害,并且繁多能源得重复加载。所以采取ajax请求,动态更动DOM。

1,怎样将经纬度等数据发送到被固化人看不到的页面上。

     
不过普通的动态的央浼不会使网站发生变化,用户点了下1页,也许点了第几页,想要重回到上1个页面时,大概会去点浏览器的再次来到键,那样就产生重临的时候不是回去到原来查看的页面了,而是上三个网站了。举例中央电视台的消息网正是这么的。下边从ajax请求开头谈起,以2个总体的案例举行剖析。

贰,怎么着绕过或或威逼让展开链接的人同意使用一定(弹窗)。

      做了2个demo

三,如今或取经纬度后,要活动用谷歌(Google)地球去分析用户地方(通过卫星地形图定位并出示),怎么样简化那壹有的,让被定位者的经纬度自动生成地图图片并同步导入到别的页面(不问可见无法让被定位者察觉自己被固定的这一实际)。

澳门葡京 1

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-">
<meta name="viewport" content="width=device-width, initial-scale=, maximum-scale=">
<title>demo..</title>
<script type="text/javascript" src="http://libs.useso.com/js/jquery/../jquery.min.js"></script>
<style type="text/css">
.demo{width:px; margin:px auto px auto}
.geo{margin-top:px}
.demo p{line-height:px; font-size:px}
.demo p span,#baidu_geo,#google_geo{font-weight:bold}
</style>
</head>
<body>
<div id="main">
 <div class="demo">
  <p>地理坐标:</p>
  <div class="geo">
   <p>百度地图定位位置:</p>
   <p id="baidu_geo"></p>
  </div>
  <div class="geo">
   <p>GOOGLE地图定位位置:</p>
   <p id="google_geo"></p>
  </div>
 </div>
</div>
<script>
function getLocation(){
 if (navigator.geolocation){
  navigator.geolocation.getCurrentPosition(showPosition,showError);
 }else{
  alert("浏览器不支持地理定位。");
 }
}
function showPosition(position){
 $("#latlon").html("<br />纬度:"+position.coords.latitude +'<br />经度:'+ position.coords.longitude);
 var latlon = position.coords.latitude+','+position.coords.longitude;
 //baidu
 var url = "http://api.map.baidu.com/geocoder/v/?ak=Cbdaebdbbbabceb&callback=renderReverse&location="+latlon+"&output=json&pois=";
 $.ajax({ 
  type: "GET", 
  dataType: "jsonp", 
  url: url,
  beforeSend: function(){
   $("#baidu_geo").html('正在定位...');
  },
  success: function (json) { 
   if(json.status==){
    $("#baidu_geo").html(json.result.formatted_address);
   }
  },
  error: function (XMLHttpRequest, textStatus, errorThrown) { 
   $("#baidu_geo").html(latlon+"地址位置获取失败"); 
  }
 });
 //google
 var url = 'http://maps.google.cn/maps/api/geocode/json?latlng='+latlon+'&language=CN';
 $.ajax({ 
  type: "GET",
  url: url, 
  beforeSend: function(){
   $("#google_geo").html('正在定位...');
  },
  success: function (json) { 
   if(json.status=='OK'){
    var results = json.results;
    $.each(results,function(index,array){
     if(index==){
     $("#google_geo").html(array['formatted_address']);
     }
    });
   }
  },
  error: function (XMLHttpRequest, textStatus, errorThrown) { 
   $("#google_geo").html(latlon+"地址位置获取失败"); 
  } 
 });
}
function showError(error){
 switch(error.code) {
  case error.PERMISSION_DENIED:
   alert("定位失败,用户拒绝请求地理定位");
   break;
  case error.POSITION_UNAVAILABLE:
   alert("定位失败,位置信息是不可用");
   break;
  case error.TIMEOUT:
   alert("定位失败,请求获取用户位置超时");
   break;
  case error.UNKNOWN_ERROR:
   alert("定位失败,定位系统失效");
   break;
 }
}
getLocation();
</script>
</body>
</html>

   首先,写两个伸手:

以上代码正是落到实处h伍和ajax手提式有线电话机定位代码,后续还会到处更新完善,请我们持续眷评释本之家网址。

 //当前第几页
  var pageIndex = 0;
  //请求函数
  function makeRequest(pageIndex){
    var request = new XMLHttpRequest();
    request.onreadystatechange = stateChange;
    //请求传两个参数,一个是当前第几页,另一个是每页的数据条数
    request.open("GET", "/getBook?page=" + pageIndex + "&limit=4", true);
    request.send(null);
    function stateChange(){
      //状态码为4,表示loaded,请求完成
      if(request.readyState !== 4 ){
        return;
      }
      //请求成功
      if(request.status >= 200 && request.status < 300 || request.status === 304){
        var books = JSON.parse(request.responseText);
        renderPage(books); 
      }
    }
  }

你大概感兴趣的篇章:

  • 接纳ajax和history.pushState无刷新改换页面UQashqaiL示例
  • 依据Jquery.history化解ajax的进化后退难题
  • 依照h伍的history改正ajax列表请求体验

     获得多少后张开渲染:

  function renderPage(books){
    var bookHtml = 
      "<table>" +
      "  <tr>" +
      "    <th>书名</th>" +
      "    <th>作者</th>" +
      "    <th>版本</th>" +
      "  </tr>";
    for(var i in books){
      bookHtml += 
        "<tr>" +
        "  <td>" + books[i].book_name + "</td>" +
        "  <td>" + books[i].author + "</td>" +
        "  <td>" + books[i].edition + "</td>" +
        "</tr>";
    }
    bookHtml += "</table>";
    bookHtml += 
      "<button>上一页</button>" + 
      "<button onclick='nextPage();'>下一页</button>";
    var section = document.createElement("section");
    section.innerHtml = bookHtml;
    document.getElementById("book").appendChild(section); 
  }

如此那般四个着力的ajax请求就搭起来了,然后再响应“下①页”按钮:

  function nextPage(){
    //将页面的index加1
    pageIndex++;
    //重新发请求和页面加载
    makeRequest(pageIndex);
  }

到此,假使不做任何管理的话,就不可见发挥浏览器重临、前进按键的职能。

     
如若能够检查评定用户点了落后、前进开关的话,就足以做些作品。h伍就是充实了这般二个轩然大波window.onpopstate,当用户点击那三个按键就能触
发这几个事件。然则光检查测试到那几个事件是不够的,还得能够传些参数,也便是说重返到在此以前这几个页面包车型地铁时候得精通特别页面包车型客车pageIndex。通过
history的pushState方法能够达到规定的标准那个指标,pushState(pageIndex)将当前页的pageIndex存起来,再回到到那些页面时获得到这些pageIndex。pushState的参数如下:

复制代码 代码如下:

window.history.pushState(state, title, url);

     
当中state为二个object{},用来存放当前页面包车型客车多少,title标题未有多大的功能,url为当前页面的url,1旦改动了那一个url,浏览器地址栏的位置也会跟着变动。

      于是,在呼吁下1页数据的nextPage函数里面,增加一步操作:

  function nextPage(){
    pageIndex++;
    makeRequest(pageIndex);
    //存放当前页面的数据
    window.history.pushState({page: pageIndex}, null, window.location.href); 
  }

下一场监听popstate事件:

  //如果用户点击返回或者前进按钮
  window.addEventListener("popstate", function(event){
    var page = 0;
    //由于第一页没有pushState,所以返回到第一页的时候是没有数据的,因此得做下判断
    if(event.state !== null){
      page = event.state.page;
    }
    makeRequest(page); 
    pageIndex = page;
  });

     state数据通过event传进来,那样就足以拿走pageIndex。

澳门葡京 2

只是,那样完结还万分,在其次页的时候若是刷新页面包车型大巴话,会发出错乱,如下所示:首先点下壹页到第1页,然后刷新页面,出现第贰页,再点下1页,出现第2页,点回到时出现难题,显示依然其次页,不是指望的第三页,直到再也点重回时才是首先页:

澳门葡京 3

 从右边的工具栏能够窥见,点第贰遍回到的时候获得到的pageIndex如故是一。对于这种意况,须要分析history模型,如下所示:

澳门葡京 4

 能够清楚为对history的操作,浏览器有一个行列,用来存放访问的笔录,蕴涵每个访问的网站还有state数据。一开头,队列的首指针指向page

0的职位,点下1页时,试行了pushState,在这一个行列插入了一个因素,同时经过pushState操作记录了这些成分的url和state数据。
在此间能够见见,pushState的操作最器重的遵循依然给history队列插入成分,这样浏览器的落5按键才不是置灰的动静,其次才是地方说的寄放
数据。点后退的时候,队首指南针后退一步指向page =
0的岗位,点前进时又进步指向page = 一的职位。

借使在page = 壹的任务刷新页面,模型是其一样子的:

澳门葡京 5

在第三步刷新的时候,页面包车型地铁pageIndex又过来成暗中认可值0,所以page =
0,显示第三页数据,不过history所用的队列并从未改造。然后再点下一页时,又给那个行列push了三个成分,这些队列就有五个pageIndex
为一的因素,所以必须得四次回到技巧再次回到page =
0的地方,也即是上边说的乱7八糟的境况。

据悉地点的剖析,那样的实现是有标题标,壹但用户不是在page =
0的岗位刷新页面,就能够并发需求点多次回来按键工夫够回来原先的页面。

就此得在刷新的时候,把当前页的state数据更新一下,用replaceState,替换队列队首指针的数目,也正是当前页的数码。方法是页面伊始化时replace一下:

window.history.replaceState({page: pageIndex /*此处为0*/}, null,
window.location.href);
那般模型就产生:

澳门葡京 6

但实际用户刷新的时候更希望的是依然显妥当前页,而不是回去第三页。3个化解办法是用当前页的window.history.state数据,这几个天性浏览器援助得相比较晚。在页面早先化时设置pageIndex时就从history.state取:

 

var pageIndex = window.history.state === null ? 0 : window.history.state.page; 

     
safari里面包车型客车history.state是近年实施pushState传入的数量,因而这一个点子在chrome/firefox里面行得通,不过safari行不通。

      第2种办法是重视h五的localStorage存放当前页数:

 //页面初始化,取当前第几页先从localStorage取
  var pageIndex = window.localStorage.pageIndex || 0;

  function nextPage(){
    //将页面的index加1,同时存放在localStorage
    window.localStorage.pageIndex = ++pageIndex;
    //重新发请求和页面加载
    makeRequest(pageIndex);
    window.history.pushState({page: pageIndex}, null, window.location.href); 
  }

  window.addEventListener("popstate", function(event){
    var page = 0;
    if(event.state !== null){
      page = event.state.page;
    }
    makeRequest(page); 
    //点击返回或前进时,需要将page放到localStorage
    window.localStorage.pageIndex = page;
  });

     
将页面中兼有改换pageIndex的地点,同时内置localStorage。那样刷新页面包车型客车时候就可以取到当前页的pageIndex。

     
下边包车型地铁方式都以将pageIndex放到了state参数里,还有一种方法是把它放到首个参数url里,也正是说通过更改当前页网站的点子。pageIndex从网站里面取:

 //当前第几页
   var pageIndex = window.location.search.replace("?page=", "") || ;
   function nextPage(){
     //将页面的index加
     ++pageIndex;
     //重新发请求和页面加载
     makeRequest(pageIndex);
     window.history.pushState(null, null, "?page=" + pageIndex);
   }

      注意,1旦执行了第9行的pushState,当前网站的地点就能够爆发变化。

     
有有些急需小心的是,window.history.length即便回到是的此时此刻队列的元素个数,但不意味history自身便是这一个队列,通过不相同浏览器的对history[i]的输出:

澳门葡京 7

  
能够看看history是1个数组,它的作用是让用户获得history.length,当前的长短,可是填充的内容是不鲜明的。 

     
除了使用history之外,还有借助hash的措施,微博新闻就是采纳了那样的不二法门:

   //当前第几页
   var pageIndex = window.location.hash.replace("#page=", "") || ;
   function nextPage(){ 
     makeRequest(pageIndex);
     window.location.hash = "#page=" + pageIndex;
   }
   window.addEventListener("hashchange", function(){
     var page = window.location.hash.replace("#page=", "") || ;
     makeRequest(page);
   });

      关于协理性,参考caniuse网址:history
IE10及以上支持,hashchange的帮忙性较好,IE8及以上都援助。

     
尽管hashchange的援助性较好,可是history的亮点是足以传数据。对一些头眼昏花的接纳大概会有相当大的发挥效率,同时history支持back/go操作。

以上本文关于h5的history改良ajax列表请求体验,希望大家喜爱得舍不得放手。

你或然感兴趣的篇章:

  • 选用ajax和history.pushState无刷新改换页面UCR-VL示例
  • 依照h5ajax落成手机一定(demo)
  • 依据Jquery.history化解ajax的上扬后退难点

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website