我有一个html网站上的选项,使它使用户可以改变语言.当语言更改时,网站上的所有文本都会更改为该语言,包括搜索栏中的自动完成功能.问题是,网站上的所有文本都会立即更改语言,而自动完成功能只会在您刷新页面后更改.有办法解决吗?

const langEls = [...document.querySelectorAll(".lang")];
const titleEl = document.querySelector(".title");
const textEl = document.querySelector(".text");

let availableKeywords = {
  en: [
    'exapmle 1',
    'example 2'
  ],
  es: [
    'ejemplo 1',
    'ejemplo 2'
  ]
};

const chosenLanguage = localStorage.getItem('lang') || 'en';
document.querySelector(`.langWrap [data-lang="${chosenLanguage}"]`).classList.add('active')

const i18n = {
  en: {
    title: "Hello",
    text: "example"
  },
  es: {
    title: "Hola",
    text: "ejemplo"
  }
}

titleEl.textContent = i18n[chosenLanguage].title;
textEl.textContent = i18n[chosenLanguage].text;

langEls.forEach(el => {
  el.addEventListener('click', () => {
     const lang = el.dataset.lang;
    langEls.forEach(langEl => langEl.classList.remove('active'));
    el.classList.add('active');
    titleEl.textContent = i18n[lang].title;
    textEl.textContent = i18n[lang].text;
     localStorage.setItem('lang', lang);
  });
});

const resultsBox = document.querySelector(".result-box");
const inputBox = document.getElementById("query");
  
inputBox.onkeyup = search;
  
function display(result){
  const content = result.map((list)=>{
    return "<li onclick=selectInput(this)>" + list + "</li>";
  });

  resultsBox.innerHTML = "<ul>" + content.join('') + "</ul>";
}
  
function selectInput(list){
  inputBox.value = list.innerHTML;
  resultsBox.innerHTML = '';
}

function search(){
  let result = [];
  let input = inputBox.value;
  if(input.length){
    result = availableKeywords[chosenLanguage].filter((keyword)=>{
      return keyword.toLowerCase().includes(input.toLowerCase());
    });
    console.log(result);
  }
  display(result);

  if(!result.length){
    resultsBox.innerHTML = '';
  }
}
<div class="searchbar">
         <form id="form" role="search">
           <input type="text" id="query" name="q" placeholder="Search Here..." aria-label="Search through site content" autocomplete="off">
           <button>
             <span class="icon">
                <ion-icon name="search-outline"></ion-icon>
             </span>
           </button>
         </form>
         <div class="result-box">
         </div>
       </div>

<h3 class="title">Hello</h3>
<p class="text">example</p>

<div class="langWrap">
        <a href="#" data-lang="nl" class="lang">NL</a>
        <a href="#" data-lang="en" class="lang">EN</a>
        <a href="#" data-lang="es" class="lang">ES</a>
        <a href="#" data-lang="id" class="lang">ID</a>
</div>

<script type="module" src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"></script>
    <script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script>

代码段在stackoverflow上不起作用,因为项目不能存储在这里的localStorage中.但是,有没有一种方法可以使自动完成(可用关键字)更改为所选的语言,而不必刷新页面?

推荐答案

为了实现你想要的,你需要改变几件事:

  1. const改成let.
  2. 更改时将chosenLanguage设置为新语言.
  3. Select 新函数时调用搜索函数.

代码

const langEls = [...document.querySelectorAll(".lang")];
const titleEl = document.querySelector(".title");
const textEl = document.querySelector(".text");

let availableKeywords = {
 en: [
   'exapmle 1',
   'example 2'
 ],
 es: [
   'ejemplo 1',
   'ejemplo 2'
 ]
};

let chosenLanguage = localStorage.getItem('lang') || 'en';
document.querySelector(`.langWrap [data-lang="${chosenLanguage}"]`).classList.add('active')

const i18n = {
 en: {
   title: "Hello",
   text: "example"
 },
 es: {
   title: "Hola",
   text: "ejemplo"
 }
}

titleEl.textContent = i18n[chosenLanguage].title;
textEl.textContent = i18n[chosenLanguage].text;

langEls.forEach(el => {
 el.addEventListener('click', () => {
    const lang = el.dataset.lang;
   langEls.forEach(langEl => langEl.classList.remove('active'));
   el.classList.add('active');
   titleEl.textContent = i18n[lang].title;
   textEl.textContent = i18n[lang].text;
    localStorage.setItem('lang', lang);
    chosenLanguage = lang
    search()
 });
});

const resultsBox = document.querySelector(".result-box");
const inputBox = document.getElementById("query");
 
inputBox.onkeyup = search;
 
function display(result){
 const content = result.map((list)=>{
   return "<li onclick=selectInput(this)>" + list + "</li>";
 });

 resultsBox.innerHTML = "<ul>" + content.join('') + "</ul>";
}
 
function selectInput(list){
 inputBox.value = list.innerHTML;
 resultsBox.innerHTML = '';
}

function search(){
 let result = [];
 let input = inputBox.value;
 if(input.length){
   result = availableKeywords[chosenLanguage].filter((keyword)=>{
     return keyword.toLowerCase().includes(input.toLowerCase());
   });
   console.log(result);
 }
 display(result);

 if(!result.length){
   resultsBox.innerHTML = '';
 }
}

Javascript相关问答推荐

如何在加载的元数据上使用juserc和await中获得同步负载?

使用JavaScript重命名对象数组中的键

JS生成具有给定数字和幻灯片计数的数组子集

ReactJS中的material UI自动完成类别

过滤对象数组并动态将属性放入新数组

传递一个大对象以在Express布局中呈现

浮动Div的淡出模糊效果

成功完成Reducers后不更新状态

如何在模块层面提供服务?

使用LocaleCompare()进行排序时,首先使用大写字母

保持物品顺序的可变大小物品分配到平衡组的算法

将核心模块导入另一个组件模块时存在多个主题

使用Document.Evaluate() Select 一个包含撇号的HTML元素

MongoDB中的嵌套搜索

在SuperBase JS客户端中寻址JSON数据

Reaction即使在重新呈现后也会在方法内部保留局部值

用Reaction-RT-Chart创建实时条形图

KeyboardEvent:检测到键具有打印的表示形式

我想为我的Reaction项目在画布上加载图像/视频,图像正在工作,但视频没有

递归地将JSON对象的内容上移一级