如何从我的侦听器的回调 ES6 方式获取返回值



我做了一个输入,可以过滤软件表。

<input type="text" id="softwares-search" class="form-control" aria-label="Input de recherche" aria-describedby="softwares-search">

然后在javascript中,如果我console.log(....),我的过滤器工作得很好但是,当我用退货来代替它时,什么也没有退货。我认为这是由于我通过事件监听器的var做作:

const maxwell = () => {
search = document.querySelector('#softwares-search').value;
return softwares.filter(row => row.name.includes(search) || row.description.includes(search));
}
const softwaresSearch = document.querySelector('#softwares-search');
if (softwaresSearch) {
var results = softwaresSearch.addEventListener('keyup', maxwell)
console.log(results);
}

感谢所有

编辑1:

我太生气了,太盲目了,我得了S#!在我看来,没有必要使用全局:(

const softwaresSearch = document.getElementById('softwares-search');
if (softwaresSearch) {
softwaresSearch.addEventListener('keyup', (e) => {
search = document.getElementById('softwares-search').value;
var filtredSoftwares = softwares.filter(e => e.name.includes(search) || e.description.includes(search) );
renderTable(filtredSoftwares);
});
}
const renderTable = (softwares) => {
Object.values(softwares).forEach(value=>{
console.log(value);
});
// Todo build HTML table
}

我认为您只需要像这个一样替换当前数组,而不是返回

const maxwell = () => {
search = document.querySelector('#softwares-search').value;
softwares = softwares.filter(row => row.name.includes(search) || row.description.includes(search));
}

不需要结果:

const softwaresSearch = document.querySelector('#softwares-search');
if (softwaresSearch) {
softwaresSearch.addEventListener('keyup', maxwell)
}

据我所知,softwareSearch.addEventListener不会返回任何内容,因为它是一个事件侦听器,不会返回任何值。它只是执行第二个参数中传递的函数。你可以试着这样做代替

softwaresSearch.addEventListener('keyup', () => {
var results = maxwell();
console.log(results);
});

这样做的目的是,当keyup事件发生时,它会调用你的maxwell函数,因为这看起来就是你想要做的

在发布问题之前,请共享所有相关代码,此代码包括变量"软件";存在于我们可见之外。

此外,您的代码也存在一些问题。

  1. 我不理解您对maxwell函数的命名。您应该将函数命名为动词,而不是其他任何东西。函数是一台正在做某事,并且可能返回某事的机器。它应该以它正在做的事情命名。

  2. 在第二行,你说";搜索=&";,但是你没有把它声明为一个变量。

  3. 您返回的内容基于未验证的值(在这种情况下,"search"可以是未定义的,也可以是字符串值(,因此,您的返回很可能只返回未定义的值,而根本不返回任何值。

  4. 函数可能根本不返回任何内容,因为您在if语句中返回了一些内容。您可以使用闭包来始终返回某些内容。

  5. 我还建议将搜索字符串作为变量传递给函数,该函数应返回基于搜索查询的列表。养成使用具有预期输入/输出的简短、简洁函数的习惯,将使代码更可读、更不容易出错,也不太可能产生不必要的副作用。

  6. 我不知道您代码的其余部分,但我不建议在全局范围内分配变量。您的";maxwell"软件搜索";变量都存在于全局空间中,除非您已经将它们封装在另一个函数块中(例如jquerys$(document(.ready(((=>{…这里的所有内容都有作用域}(

  7. 您在代码中的两个不同位置获得了相同的元素。

这里有一个更新的代码示例,但我无法测试它,因为我不知道你的其余代码。

/* 
* Executing the whole thing in this IIFE will make all variables declared inside here scoped to this block only, 
* thus they can't interfere with other code you may write
*/
(() => {
const listOfSoftwares = softwares; // --- get your softwares variable here somehow, I don't know where "software" comes from.
// input element
const search = document.querySelector('#softwares-search');
/**
* Filter search results
* @param {string} query Search query
* @returns {Array} The results array
*/
const filterSoftwareSearchResults = (query) => {
let results = [];
results = listOfSoftwares.filter(software => software.description.includes(query) || software.title.includes(query))
// Verify
console.log(results); 

// Should return array of results, even if empty
return results; 
}
if (search) {
search.addEventListener('keyup', () => {
filterSoftwareSearchResults(search.value) 
})
}
})()

addEventListener函数始终返回undefined,因此results变量未定义。从回调函数(maxwell(返回也是没有用的。

您要么需要对回调中的数据进行处理,要么将数据传递给全局变量。

最新更新