suchen
HeimWeb-Frontendjs-TutorialVerbessern Sie die Erfahrung mit Ajax-Listenanfragen basierend auf dem H5-Verlauf

In diesem Artikel werden hauptsächlich relevante Informationen zur Verbesserung des Ajax-Listen-Anforderungserlebnisses basierend auf dem h5-Verlauf vorgestellt.

Websites mit umfangreichen Informationen werden normalerweise in Paginierung angezeigt. Seite“ verwenden viele Websites dynamische Anfragen, um Seitenaktualisierungen zu vermeiden. Obwohl jeder Ajax ist, können Sie die Vor- und Nachteile anhand einiger kleiner Details unterscheiden. Ein kleines Detail ist die Möglichkeit, die „Zurück“- und „Vor“-Tasten des Browsers zu unterstützen. In diesem Artikel werden zwei Methoden beschrieben, die es dem Browser ermöglichen, vor und zurück zu wechseln, oder Ajax die Möglichkeit geben, zur vorherigen Seite zurückzukehren oder zur nächsten Seite zu wechseln, genau wie bei der Umleitung auf eine neue Seite.

Der einfachste Weg, die Seitenanzeige von Daten zu implementieren, besteht darin, mehrere Seitenzahlen nach der URL hinzuzufügen. Wenn Sie auf „Nächste Seite“ klicken, wird die Webseite auf die neue Adresse von Seite+1 umgeleitet. Sinas Nachrichtennetzwerk tut dies beispielsweise, indem es die URL ändert: index_1, index_2, index_3... Wenn diese Liste jedoch nicht der Hauptteil der Seite ist oder sich beispielsweise viele Bilder und andere umfangreiche Elemente in anderen Teilen der Seite befinden, ist die Navigation ein großer Schieberegler, und wenn Sie diese Methode verwenden, wird dies auf der gesamten Seite angezeigt flackern heftig und viele Ressourcen müssen neu geladen werden. Verwenden Sie also eine Ajax-Anfrage, um das DOM dynamisch zu ändern.

Aber normale dynamische Anfragen ändern die URL nicht. Wenn der Benutzer auf die nächste Seite klickt oder auf welche Seite klickt und zur vorherigen Seite zurückkehren möchte, klickt er möglicherweise auf die Zurück-Schaltfläche des Browsers. Dadurch wird nicht zur ursprünglich angezeigten Seite, sondern zur vorherigen URL zurückgekehrt. Das Nachrichtennetzwerk von CCTV ist beispielsweise so. Beginnen wir mit der Ajax-Anfrage und analysieren sie anhand eines vollständigen Falls.

Demo erstellt

Schreiben Sie zunächst eine Anfrage:

 //当前第几页
  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); 
      }
    }
  }

Rendern Sie nach Erhalt der Daten:

  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=&#39;nextPage();&#39;>下一页</button>";
    var section = document.createElement("section");
    section.innerHtml = bookHtml;
    document.getElementById("book").appendChild(section); 
  }

Eine solche grundlegende Ajax-Anfrage wird eingerichtet und dann wird auf die Schaltfläche „Nächste Seite“ geantwortet:

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

Wenn zu diesem Zeitpunkt keine Verarbeitung erfolgt, können die Schaltflächen „Zurück“ und „Vorwärts“ des Browsers nicht verwendet werden.

Wenn Sie erkennen können, wann der Benutzer auf die Schaltflächen „Zurück“ und „Vorwärts“ klickt, können Sie einige Artikel schreiben. h5 fügt ein solches Ereignis window.onpopstate hinzu. Dieses Ereignis wird ausgelöst, wenn der Benutzer auf diese beiden Schaltflächen klickt. Es reicht jedoch nicht aus, dieses Ereignis zu erkennen. Sie müssen auch einige Parameter übergeben können. Das heißt, wenn Sie zur vorherigen Seite zurückkehren, müssen Sie den Seitenindex dieser Seite kennen. Dieser Zweck kann durch die pushState-Methode des Verlaufs erreicht werden. pushState (pageIndex) speichert den Seitenindex der aktuellen Seite und ruft dann den Seitenindex ab, wenn er zu dieser Seite zurückkehrt. Die Parameter von pushState lauten wie folgt:

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

Wobei state ein Objekt{} ist, das zum Speichern der Daten der aktuellen Seite verwendet wird , und der Titel ist nicht sehr groß. Die Rolle der URL ist die URL der aktuellen Seite. Sobald diese URL geändert wird, ändert sich auch die Adresse in der Adressleiste des Browsers entsprechend.

Fügen Sie daher in der nextPage-Funktion, die die nächste Datenseite anfordert, einen weiteren Schritt hinzu:

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

und hören Sie dann auf das Popstate-Ereignis:

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

Die Statusdaten wird durch das Ereignis übergeben. Auf diese Weise können Sie den pageIndex erhalten.

Es gibt jedoch immer noch Probleme mit dieser Implementierung. Wenn Sie die Seite auf der zweiten Seite aktualisieren, kommt es zu Verwirrung, wie unten gezeigt: Klicken Sie zunächst auf die nächste Seite Gehen Sie zur zweiten Seite und aktualisieren Sie die Seite. Klicken Sie dann auf die nächste Seite. Wenn ich auf Zurück klicke, wird immer noch ein Problem angezeigt Erste Seite. Es ist die erste Seite, bis ich erneut auf „Zurück“ klicke. Seite:

In der Symbolleiste auf der rechten Seite finden Sie den Seitenindex, den Sie erhalten, wenn Sie auf „Zurück für“ klicken Das erste Mal ist immer noch 1. Für diese Situation muss das Verlaufsmodell wie unten gezeigt analysiert werden:

kann als Vorgang des Verlaufs verstanden werden. Der Browser verfügt über eine Warteschlange zum Speichern von Zugriffsdatensätzen. Einschließlich jeder besuchten URL und Statusdaten. Zu Beginn zeigt der erste Zeiger der Warteschlange auf die Position von Seite = 0. Wenn auf die nächste Seite geklickt wird, wird pushState ausgeführt, ein Element in die Warteschlange eingefügt und die URL- und Statusdaten dieses Elements werden aufgezeichnet die pushState-Operation. Hier ist ersichtlich, dass die wichtigste Funktion der pushState-Operation darin besteht, Elemente in die Verlaufswarteschlange einzufügen, damit die Zurück-Schaltfläche des Browsers nicht ausgegraut wird, und anschließend die oben erwähnten Daten zu speichern. Wenn Sie auf „Zurück“ klicken, bewegt sich der Kopfzeiger einen Schritt zurück, um auf die Position von Seite = 0 zu zeigen, und wenn Sie auf „Vorwärts“ klicken, bewegt er sich vorwärts, um auf die Position von Seite = 1 zu zeigen.

如果在page = 1的位置刷新页面,模型是这个样子的:

在第2步刷新的时候,页面的pageIndex又恢复成默认值0,所以page = 0,显示第一页数据,但是history所用的队列并没有改变。然后再点下一页时,又给这个队列push了一个元素,这个队列就有两个pageIndex 为1的元素,所以必须得两次返回才能回到page = 0的位置,也就是上面说的错乱的情况。

根据上面的分析,这样的实现是有问题的,一但用户不是在page = 0的位置刷新页面,就会出现需要点多次返回按钮才能够回到原先的页面。

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

window.history.replaceState({page: pageIndex /*此处为0*/}, null, window.location.href);
这样模型就变成:

但其实用户刷新的时候更希望的是还是显示当前页,而不是回到第一页。一个解决办法是用当前页的window.history.state数据,这个属性浏览器支持得比较晚。在页面初始化时设置pageIndex时就从history.state取:

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

      safari里面的history.state是最近执行pushState传入的数据,因此这个办法在chrome/firefox里面行得通,但是safari行不通。

      第二种办法是借助h5的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);
   }

      注意,一旦执行了第8行的pushState,当前网址的地址就会发生变化。

      有一点需要注意的是,window.history.length虽然返回是的当前队列的元素个数,但不代表history本身就是那个队列,通过不同浏览器的对history[i]的输出:

   可以看到history是一个数组,它的作用是让用户拿到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 XMLHttpRequest对象详解

编写轻量ajax组件第三篇实现

Ajax请求中async:false/true的作用分析

Das obige ist der detaillierte Inhalt vonVerbessern Sie die Erfahrung mit Ajax-Listenanfragen basierend auf dem H5-Verlauf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
html5的div一行可以放两个吗html5的div一行可以放两个吗Apr 25, 2022 pm 05:32 PM

html5的div元素默认一行不可以放两个。div是一个块级元素,一个元素会独占一行,两个div默认无法在同一行显示;但可以通过给div元素添加“display:inline;”样式,将其转为行内元素,就可以实现多个div在同一行显示了。

html5中列表和表格的区别是什么html5中列表和表格的区别是什么Apr 28, 2022 pm 01:58 PM

html5中列表和表格的区别:1、表格主要是用于显示数据的,而列表主要是用于给数据进行布局;2、表格是使用table标签配合tr、td、th等标签进行定义的,列表是利用li标签配合ol、ul等标签进行定义的。

Nginx怎么解决history模式下页面刷新404问题Nginx怎么解决history模式下页面刷新404问题May 13, 2023 pm 02:40 PM

前置知识单页应用(SPA-singlepageapplication)只在第一次加载页面时,返回唯一的html页面和它的公共静态资源,后续的页面跳转都不会从服务端拿html文件。(hash和history路由实现浏览器url变化而不刷新页面)hash路由例子:www.baidu.com/#/home,原本hash是用来结合锚点实现页面试图的控制,当#后面的值发生改变时不会重新请求页面,主要通过window的onhashchange方法来实现。history路由相比于hash路由,最直观的变化就是

html5怎么让头和尾固定不动html5怎么让头和尾固定不动Apr 25, 2022 pm 02:30 PM

固定方法:1、使用header标签定义文档头部内容,并添加“position:fixed;top:0;”样式让其固定不动;2、使用footer标签定义尾部内容,并添加“position: fixed;bottom: 0;”样式让其固定不动。

HTML5中画布标签是什么HTML5中画布标签是什么May 18, 2022 pm 04:55 PM

HTML5中画布标签是“<canvas>”。canvas标签用于图形的绘制,它只是一个矩形的图形容器,绘制图形必须通过脚本(通常是JavaScript)来完成;开发者可利用多种js方法来在canvas中绘制路径、盒、圆、字符以及添加图像等。

javascript中的History对象如何使用javascript中的History对象如何使用Jun 02, 2023 pm 04:55 PM

length  history.length属性保存着历史记录的URL数量。初始时,该值为1。由于IE10+浏览器在初始时返回2,存在兼容性问题,所以该值并不常用跳转方法  go()、back()和forward()  如果移动的位置超出了访问历史的边界,以上三个方法并不报错,而是静默失败  [注意]使用历史记录时,页面通常从浏览器缓存之中加载,而不是重新要求服务器发送新的网页。不触发onload增改记录  HTML5为history对象添加了两个新方法,history.pushState()和

html5中不支持的标签有哪些html5中不支持的标签有哪些Mar 17, 2022 pm 05:43 PM

html5中不支持的标签有:1、acronym,用于定义首字母缩写,可用abbr替代;2、basefont,可利用css样式替代;3、applet,可用object替代;4、dir,定义目录列表,可用ul替代;5、big,定义大号文本等等。

如何使Linux的history命令在前面显示日期?如何使Linux的history命令在前面显示日期?Jan 13, 2024 pm 09:24 PM

linux系统中想要在history前面显示日期,该怎么设置呢?我们可以在用户的.bashrc文件中进行配置,应用生效后就可以在使用history命令中前面显示日期了,请看下文详细介绍。1、使用ubuntulinux的系统可以在桌面右键“打开终端”。2、使用以下命令打开.bashrc文件。$sudogedit~/.bashrc3、我们会打开这样一个bashrc文件窗口。4、在最后我们加入exportHISTTIMEFORMAT="%F%T"或者也可以使用expo

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),