JavaScript:编码练习,输入首字母输入框自动联想以该字母开头的国家列表

本文介绍了如何实现实时的国家名称输入联想功能。当用户在输入框开始输入以'A'开头的国家名时,页面会即时显示匹配的国家列表。通过监听输入事件并创建带有点击事件处理的建议元素,实现了用户选择国家后输入框自动填充的功能。同时,对CSS进行了样式设置,以提升用户体验。
摘要由CSDN通过智能技术生成

问题描述

        当用户在输入框中输入国家名称时,页面会显示相应国家的列表。单击建议的国家会替换输入框中的值。为简单起见,仅考虑以"A" 开头的国家。

HTML:

<html>
 <head>
 </head>
 <body>
   <label for="country">Enter a country name</label>:
	<input type="text" id="country">
	<div id="suggestions"></div>

 </body>
</html>

CSS:

/* Add spacing between each country suggestion */
.suggestion {
    padding-left: 2px;
    padding-right: 2px;
}

/* Change suggestion color when hovering it with the mouse */
.suggestion:hover {
    background-color: #adf;
    cursor: pointer;
}

/* Position the suggestion list just below the input box */
#suggestions {
    position: absolute;
    border: 1px solid black;
    left: 155px;
}

显示效果:

 解决方法

        我的:必须在输入完点击别的地方才能显示出来,也就是失去焦点之后。。。。

        解决,监听事件类型改为 "input" 即可

// Country list
const countryList = [
  "Afghanistan",
  "Albania",
  "Algeria",
  "Andorra",
  "Angola",
  "Anguilla",
  "Antarctica",
  "Antigua-and-Barbuda",
  "Argentina",
  "Armenia",
  "Aruba",
  "Australia",
  "Autria",
  "Azerbaïjan"
];
const countryElement = document.getElementById("country");
const suggetsElement = document.getElementById("suggestions");
const createParaElement = text=>{
  const element = document.createElement("p");
  element.textContent = text;
  return element;
}
countryElement.addEventListener("change", e=>{
  if(e.target.value.startsWith("A"))
  {
    countryList.forEach(country =>{
    suggetsElement.appendChild(createParaElement(country));
  });
  }
});
suggetsElement.addEventListener("click", e=>{
  countryElement.value =  e.target.textContent;
  document.body.removeChild(suggetsElement);
});

显示效果:

         参考答案:输入框以输入就显示联想建议

// Country list
const countryList = [
  "Afghanistan",
  "Albania",
  "Algeria",
  "Andorra",
  "Angola",
  "Anguilla",
  "Antarctica",
  "Antigua-and-Barbuda",
  "Argentina",
  "Armenia",
  "Aruba",
  "Australia",
  "Autria",
  "Azerbaïjan"
];

const countryElement = document.querySelector("input");
const suggestionsElement = document.getElementById("suggestions");

// Create and return a suggestion
const createSuggestionElement = country => {
  const element = document.createElement("div");
  element.classList.add("suggestion");
  element.textContent = country;
  // Handle click on a suggestion
  element.addEventListener("click", e => {
    // Replace input with suggested country
    countryElement.value = e.target.textContent;
    // Empty the suggestion list
    suggestionsElement.innerHTML = "";
  });
  return element;
};

// Handle input change
countryElement.addEventListener("input", () => {
  // Empty suggestion list
  suggestionsElement.innerHTML = "";
  countryList.forEach(country => {
    // Check if the inputted value matches the start of the country
    if (country.startsWith(countryElement.value)) {
      // Add the country as suggestion
      suggestionsElement.appendChild(createSuggestionElement(country));
    }
  });
});

看了答案之后的改进:

// Country list
const countryList = [
  "Afghanistan",
  "Albania",
  "Algeria",
  "Andorra",
  "Angola",
  "Anguilla",
  "Antarctica",
  "Antigua-and-Barbuda",
  "Argentina",
  "Armenia",
  "Aruba",
  "Australia",
  "Autria",
  "Azerbaïjan"
];
const countryElement = document.getElementById("country");
const suggetsElement = document.getElementById("suggestions");

const createParaElement = text=>{
  const element = document.createElement("div");
  element.classList.add("suggestion");
  element.textContent = text;
  element.addEventListener("click",e=>
  {
    countryElement.value=e.target.textContent;
    suggetsElement.innerHTML="";
  });
  return element;
}
countryElement.addEventListener("input", e=>{
  suggetsElement.innerHTML = "";
  countryList.forEach(country =>
  {
    if(country.startsWith(e.target.value))
    {
      suggetsElement.appendChild(createParaElement(country));
    }
  });
  
});

插件使用配置(config)还是很灵活的,当然也是弊端,配置不当,效果就没了。 使用时候,重要的参数如下(此demo参数配置点击右键看源码): url: 'http://suggest.taobao.com/sug?code=utf-8&extras=1', queryName: 'q', //url?queryName=value,默认为输入框的name属性 jsonp: 'callback', //设置此参数名,将开启jsonp跨域功能(我要调淘宝数据,非跨域不可,淘宝的回调参数名就是callback),否则使用json数据结构 item: 'li', //下拉提示项目单位的选择器,默认一个li是一条提示,与processData写法相关。 processData: function(data){ }//自定义处理返回的数据,该方法可以return一个html字符串或jquery对象,将被写入到提示的下拉层中。 右键查看源码,将看到本demo所编写的processData函数是怎样的,所以这个参数是把如何表现交给你来做了,但别忘了配合 item 参数 getCurrItemValue: function($currItem){ }//定义如何去取得当前提示项目的值并返回值,插件根据此函数获取当前提示项目的值,并填入input中,此方法应根据processData参数来定义。 是的,如果你自定义了processData,这个参数恐怕也需要自定义,默认是获取$currItem.html(),你也可以return $currItem.attr('an attrName'); 右键查看源码,将看到本demo所编写的getCurrItemValue函数是怎样的 textchange: function($input){}, //不同于change事件在失去焦点触发,inchange依赖本插件,只要内容有变化,就会触发,并传入input对象 onselect: function($currItem){} //当选择了下拉的当前项目时执行,并传入当前项目。比如选择了某个提示项目,就提交表单。 sequential: 0, //按着方向键不动是否可以持续选择,默认不可以,设置值可以是任何等价的boolean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值