Fehlermeldung X is not a Function trotz Fefinierung der Funktion

  • JavaScript

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von shad.

    Fehlermeldung X is not a Function trotz Fefinierung der Funktion

    Guten Morgen,

    seit ein paar Stunden beschäftigt mich dieser Fehler, ich weis nicht warum er auftritt, die Funktion ist ja definiert.
    Über hilfreiche Antworten würde ich mich freuen.

    Mein Code:
    Spoiler anzeigen

    JavaScript-Quellcode

    1. class SearchBar {
    2. /**
    3. * SearchBar Constructor
    4. * @param {Element} input
    5. * @param {Element} suggestions
    6. */
    7. constructor(input, suggestions, suggestions_array) {
    8. this['eInput'] = input
    9. this['eSuggestions'] = suggestions
    10. this['arraySuggestions'] = suggestions_array
    11. this.setEventListeners()
    12. }
    13. setEventListeners() {
    14. this.eInput.addEventListener('keydown', this.eInput_onKeyDown)
    15. this.eInput.addEventListener('focusin', this.eInput_onFocusIn)
    16. this.eInput.addEventListener('focusout', this.eInput_onFocusOut)
    17. this.eInput.addEventListener('keyup', this.eInput_onKeyUp)
    18. }
    19. suggestionsToggle(state) {
    20. if (state == true) {
    21. this.eSuggestions.style.display = 'unset'
    22. }
    23. if (state == false) {
    24. this.eSuggestions.style.display = 'none'
    25. }
    26. }
    27. eInput_onKeyDown(e) {
    28. if (e.key == "Enter") {
    29. this.blur()
    30. }
    31. }
    32. eInput_onFocusIn(e) {
    33. var inp = e.target.parentNode.parentNode
    34. inp.classList.add('focus')
    35. }
    36. eInput_onFocusOut(e) {
    37. var inp = e.target.parentNode.parentNode
    38. inp.classList.remove('focus')
    39. this.suggestionsToggle(false)
    40. }
    41. eInput_onKeyUp(e) {
    42. const text = this.value
    43. if (text == '') {
    44. this.suggestionsToggle(false)
    45. } else {
    46. this.suggestionsToggle(true)
    47. }
    48. if (!text) return
    49. const suggestionArray = this.arraySuggestions.filter((data) => {
    50. return data.startsWith(text.toLowerCase())
    51. })
    52. this.suggestionsUpdate(suggestionArray)
    53. }
    54. eSuggestions_onItemClick(e) {
    55. alert(e.target.getAttribute('value'))
    56. }
    57. suggestionsUpdate(e) {
    58. // Clearing suggsetion list
    59. this.eSuggestions.innerHTML = ''
    60. if (e.length == 0) {
    61. this.suggestionsToggle(false)
    62. }
    63. e.forEach((sugg) => {
    64. var liElement = document.createElement('li')
    65. liElement.setAttribute('value', sugg)
    66. liElement.addEventListener('click', this._eSuggestions_onItemClick)
    67. liElement.appendChild(document.createTextNode(sugg))
    68. this.eSuggestions.appendChild(liElement)
    69. })
    70. }
    71. }



    Fehler Meldung:

    Quellcode

    1. class.searchbar.js:57 Uncaught TypeError: this.suggestionsToggle is not a function
    2. at HTMLInputElement.eInput_onKeyUp (class.searchbar.js:57)
    Ohne es getestet zu haben:
    Vermutlich verliert sich der this Kontext wenn du die handler als Event Listener weitergibts. Sprich, sobald die Handler aufgerufen werden zeigt das this in den Handlern nicht mehr auf deine Klasse, sondern auf irgendetwas anderes.

    Versuch mal die Handler explizit an die Klasse zu binden:

    JavaScript-Quellcode

    1. ...
    2. this.eInput.addEventListener('keydown', this.eInput_onKeyDown.bind(this))
    3. ...


    Alternativ könntest du die Handler auch einfach als Arrow Functions definieren (die capturen this immer korrekt wie man es erwarten würde):

    JavaScript-Quellcode

    1. this.eInput.addEventListener('keydown', (e) => {
    2. if (e.key == "Enter") {
    3. this.blur()
    4. }
    5. })