小白速通JavaScript之DOM项目实战

DOM操作二

实现简易版百度关键词搜索
在这里插入图片描述

  1. 首先,我们在不考虑鼠标交互的情况下,完成静态 HTML 页面

  2. 监听搜索框 Input 输入事件(这部分代码内置,下一章我们马上会讲到)

  3. 当输入内容是肺炎时,显示模糊搜索结果

  4. 当输入内容不是肺炎时,显示登录查看历史

  5. HTML页面:搜索框,登录查看历史,肺炎相关列表

<body>
  <div>
    <nav>
      <!-- 头部搜索框区域 -->
    </nav>
    <main>
      <!-- 输入非'肺炎'情况 -->
      <section class="login">
        登录查看历史
      </section>
      <!-- 输入'肺炎'情况 -->
      <ul class="search-result">
        <li>
          <i class="search"></i>
          <p><em>肺炎</em>疫情实时动态</p>
          <i class="edit"></i>
        </li>
        ……
      </ul>
    </main>
  </div>
</body>
  1. 监听Input输入实践,处理区域隐藏
const input = document.querySelector('input');

// 监听键盘事件
input.addEventListener('keyup', function() {
  // this 是DOM节点,this.value可以获取input内输入的值
  console.log(this.value);
});

在 Input 输入框里面输入内容,内容会实时在 JSConsole 打出这就说明我们已经完成输入事件的监听。

  1. 监听输入肺炎时,显示肺炎查询结果

显示和隐藏我们知道可以利用 CSS 知识 display:block/none;进行控制。
因此首先我们修改 CSS 将登录查看历史设置可见,将搜索结果设置不可见

main .search-result {
  padding: 0;
  display: none;
}

接着修改JavaScript代码,动态控住显示和隐藏:

const input = document.querySelector('input');

const login = document.querySelector('.login');
const searchResult = document.querySelector('.search-result');

// 监听键盘事件
input.addEventListener('keyup', function() {
  // this 是DOM节点,this.value可以获取input内输入的值
  if (this.value === '肺炎') {
    login.style.display = 'none';
    searchResult.style.display = 'block';
  } else {
    login.style.display = 'block';
    searchResult.style.display = 'none';
  }
});
  1. 肺炎搜索结果动态显示

我们知道搜索结果肯定不会是页面写死的,在实际情况下,这些数据都会实时变换的。这部分数据是由 Javascript 发起网络请求返回的数据,然后利用动态生成节点的方法插入页面。

我们还未学习网络请求,暂时先模拟在 Javascript 代码中,如下代码

let data = [
  '<em>肺炎</em>实时疫情动态',
  '<em>肺炎</em>的症状有哪些症状',
  '<em>肺炎</em>武汉',
  '<em>肺炎</em>症状',
  '<em>肺炎</em>最新',
  '<em>肺炎</em>是怎么引起的',
  '<em>肺炎</em>最新消息',
  '<em>肺炎</em>实时',
  '<em>肺炎</em>症状及表现',
  '<em>肺炎</em>最新情况'
];

我们需要利用这份数组数据,生成多个li 标签内容,li 标签模板如下

<li>
  <i class="search"></i>
  <p><em>肺炎</em>疫情实时动态</p>
  <i class="edit"></i>
</li>

我们封装一个函数,用于生成这个DOM 节点,代码如下

function createSearchItem(txt) {
  const item = document.createElement('li');
  item.innerHTML = `<i class="search"></i><p>${txt}</p><i class="edit"></i>`;
  return item;
}

在这里我们使用 innerHTML模板字符串 快速创建 li 内容。
最后我们需要遍历搜索结果数据数组,依次创建 li,并插入到页面中,代码如下

let data = [
  '<em>肺炎</em>实时疫情动态',
  '<em>肺炎</em>的症状有哪些症状',
  '<em>肺炎</em>武汉',
  '<em>肺炎</em>症状',
  '<em>肺炎</em>最新',
  '<em>肺炎</em>是怎么引起的',
  '<em>肺炎</em>最新消息',
  '<em>肺炎</em>实时',
  '<em>肺炎</em>症状及表现',
  '<em>肺炎</em>最新情况'
];

function createSearchItem(txt) {
  const item = document.createElement('li');
  item.innerHTML = `<i class="search"></i><p>${txt}</p><i class="edit"></i>`;
  return item;
}

const input = document.querySelector('input');

const login = document.querySelector('.login');
const searchResult = document.querySelector('.search-result');

// 监听键盘事件
input.addEventListener('keyup', function() {
  // this 是DOM节点,this.value可以获取input内输入的值
  if (this.value === '肺炎') {
    // 先把原始内容清空
    searchResult.innerHTML = '';
    for (let i = 0; i < data.length; i++) {
      searchResult.appendChild(createSearchItem(data[i]));
    }

    login.style.display = 'none';
    searchResult.style.display = 'block';
  } else {
    login.style.display = 'block';
    searchResult.style.display = 'none';
  }
});

总结思路
首先我们在不考虑动态效果情况下,把页面中所涉及到的所有元素都用静态页面的形式写出来,
其次利用 Javascript 控制区域的显示和隐藏,达到动态效果,
最后根据写好的静态页面模板和数据,动态创建 DOM 节点

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值