Permalänk

Javascript searchbar med API

Jag vill kunna söka på Wikipedia med denna kod, men när jag kör den får jag bara fram "this.searchUpdate is not a fuction." och jag förstår inte varför. Tacksam för all hjälp jag kan få!

Här är min kod:

const template = document.createElement('template')
template.innerHTML = `
<style>
h1 {
font-family: times new roman;
font-size: 30px;
}
</style>
<h1>WikiSearch</h1>
<input type="search" placeholder="Search Wikipedia.." id="searchbar">
<button type="submit" id="button">Search</button>`

/**
* Define custom element.
*/
customElements.define('my-wiki-search',
class extends HTMLElement {
constructor () {
super()
this.attachShadow({ mode: 'open' })
.appendChild(template.content.cloneNode(true))
this._searchbar = this.shadowRoot.querySelector('#searchbar')
this._button = this.shadowRoot.querySelector('#button')
this._search
}

async getSearchResult (word) {
const search = await window.fetch(`https://en.wikipedia.org/w/api.php?action=query&list=search&format=json&origin=*&srsearch=${word}`)
console.log(search.json())
}

async searchUpdate (str) {
let result = await window.fetch(`https://en.wikipedia.org/w/api.php?action=query&list=search&format=json&origin=*&srsearch=${str}`)
result = await result.json
searchPromises = []
result.result.forEach(id => {
searchPromises.push(this.getSearchResult(id))
})
this._search = await Promise.all(searchPromises)
}

connectedCallback () {
this._button.addEventListener('click', function() {
this.searchUpdate(this._searchbar).then (()=> this._updateRendering())
})
}

})

Permalänk
Medlem

Det är helt enkelt för att this inuti din click-handler refererar till själva knappen och inte till din klassinstans.
Du kan se detta genom att helt enkelt lägga en console.log(this) direkt ovanför anropet till this.searchUpdate(...)

För att this istället ska referera till din klassinstans måste du endera använda dig av Function.prototype.bind eller en arrow function.

T.ex.

connectedCallback () { this._button.addEventListener('click', ev => { this.searchUpdate(this._searchbar).then(()=> this._updateRendering()) }) }

Här finns ett mer detaljerat svar.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W