JavaScprit30-6 学习笔记

news/2024/7/5 20:30:15

今天学习的是  仿即时搜索诗句效果

 

第一个问题:

fetch()

Fetch API  提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应。它还提供了一个全局 

fetch()
方法,该方法提供了一种简单,合乎逻辑的方式来跨网络异步获取资源。

一个基本的 fetch请求设置起来很简单。看看下面的代码:

let myImage = document.querySelector('img');

fetch('flowers.jpg')
.then(function(response) {
    return response.blob();
})
.then(function(myBlob) {
    let objectURL = URL.createObjectURL(myBlob);
    myImage.src = objectURL;
});

--mdn

这是一个还在试验的用来替代AJAX的方法...第一次见哦。

项目源码:

 const endpoint = 'https://gist.githubusercontent.com/soyaine/81399bb2b24ca1bb5313e1985533c640/raw/bdf7df2cbcf70706c4a5e51a7dfb8c933ed78878/TangPoetry.json';
    
     
    const  poetrys = [];
    fetch(endpoint)
        .then(blob => blob.json())
        .then(data => poetrys.push(...data));

注意:ECMAScript 6引入三个点“...”语法用来分别代表一个数组参数列表

如果使用... 则会出现 这样的情况..

数据都被存在数组的第一个元素里了...

之后就是一个查找的函数...

使用到了filter()和正则。

先看看源码..

return poetrys.filter(poet => {
            // 正则找出匹配的诗句
            const regex = new RegExp(wordToMatch, 'gi');
            const author = poet.detail_author.join('');
//            console.log(author);
            return poet.detail_text.match(regex) || poet.title.match(regex) || author.match(regex);
        });
const regex = new RegExp(wordToMatch, 'gi'); 中 g表示全局,i表示不区分大小写

  match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

  该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。

 为什么这么命名,我们来看看数据就知道了...

我们用到的 就是这三条获取到的数据的名字....

 

之后就是给输入框设置监听然后调用 上面的函数来实现某些功能啦!

  function lala() {
      const matchArr= fundProtory(this.value, shice);
      console.log(matchArr);
  }

    const searchInput = document.querySelector('.search');
    const suggestions = document.querySelector('.suggestions');

    searchInput.addEventListener('change',lala);
        searchInput.addEventListener('keyup',lala);

...不过似乎是网络不好的问题 ...我的fetch请求失败啦..

 

最后完善代码,通过JS操作 修改 视图

function lala() {
     const matches = findMatches(this.value, poetrys);
    const regex = new RegExp(this.value, 'gi');
    const html = matches.map( poet => {
      // 替换高亮的标签
      const text = poet.detail_text.replace(regex, `<span class="hl">${ this.value }</span>`);
      const title = poet.title.replace(regex, `<span class="hl">${ this.value }</span>`)
      // 构造 HTML 值
      return `
        <li>
          <span class="poet">${ text }</span>
          <span class="title">${ title } - ${ poet.detail_author[0] }</span>
        </li>
      `;
    }).join('');
//    console.log(html);
    suggestions.innerHTML = html;
  }

关键点: map 和replace  ...

 const text = poet.detail_text.replace(regex, `<span class="hl">${ this.value }</span>`);

通过replace 来替换 正则判断过的部分,也就是输入的部分!

 

通过map 来筛选 有输入部分的 数组元素。

 

最后的效果就和上面一样啦!。


http://www.niftyadmin.cn/n/1733088.html

相关文章

java删除目录下所有文件以及目录

import java.io.File;public class Test12121 {/*** param args*//*** 删除目录下一级的所有文件与目录* param file*/private void delTempFiles(File file,Test12121 biz) throws Exception{//if(file.isFile()) {//if(!file.delete()) {if(file.isFile()) {file.delete();} …

Ubuntu18.04和Win10共享文件夹

Ubuntu18.04和Win10共享文件夹 陈拓2021/08/05-2020/08/08 1. 概述 Ubuntu18.04局域网共享文件夹&#xff0c;实现win10和Ubuntu局域网访问。 2. Ubuntu 下设置共享文件夹 右击要共享的文件夹 例如hk 选择Local Network Share点击Share this folder&#xff0c;需要安装共享…

守护线程与用户线程

守护线程与普通线程的唯一区别是&#xff1a;当JVM中所有的线程都是守护线程的时候&#xff0c;JVM就可以退出了&#xff1b;如果还有一个或以上的非守护线程则不会退出。&#xff08;以上是针对正常退出&#xff0c;调用System.exit则必定会退出&#xff09; 所以setD…

选择好友的下拉控件

<!doctype html public "-//W3C//DTD HTML 4.01//EN http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"/><title>選擇好友</title>&l…

Ubuntu18.04安装使用Qt编译海康威视SDK DEMO

Ubuntu18.04安装使用Qt编译海康威视SDK DEMO 陈拓 2021/08/09-2020/08/09 1. Ubuntu 18.04安装Qt 我们在《海康威视SDK实例QtDemo显示NVR视频窗口(LinuxQt)》 https://zhuanlan.zhihu.com/p/395178052 https://blog.csdn.net/chentuo2000/article/details/119299045 一文中…

apache与tomcat整合

http://www.jsprun.net/thread-13542-1-1.html安装Apache(1) Apache的安装非常简单&#xff0c;双击下载的apache_2.2.11-win32-x86-no_ssl.msi 文件&#xff1a;(2) 选择接受许可协议后&#xff0c;点击Next:&#xff08;3&#xff09;继续点击Next看到apache的介绍文档&#…

Linux C++的cout和printf显示ASCII码的区别

2021/08/15 程序片段&#xff1a; #include <stdio.h> #include <iostream> using namespace std;char ctemp 8; // 字符 8cout << "\nctemp: " << ctemp; // 8cout << "\nctemp: " << ctemp*1; // 转换成ASCII码5…

Linux命令行终端图形界面编程库curses

Linux命令行终端图形界面编程库curses 陈拓 2021/08/22-2020/08/23 1. 概述 curses是一个在Linux/Unix下广泛应用的图形函数库&#xff0c;作用是可以在终端内绘制简单的图形用户界面。 本文在Ubuntu下安装curses。 Ubuntu版本&#xff1a; 2. Ubuntu安装curses 2.1 直接安…