JavaScript - Cannot read properties of undefined (reading

 
Vista:
Imágen de perfil de Jhon

Cannot read properties of undefined (reading

Publicado por Jhon (4 intervenciones) el 06/04/2023 06:01:51
Hola, tengo un input y un botón, al hacer click me sale:
Cannot read properties of undefined (reading 'toLowerCase')

He leído varios posts y he instentado varias cosas, pero la verdad no se como resolver el problema.

1
2
<input type="text" id="search" placeholder="Buscar usuario..." value="">
<button id="submit" onclick="searchUsers()">Buscar</button>

1
2
3
4
5
6
7
8
9
10
11
const searchInput = document.getElementById("search");
console.log("searchInput " + searchInput);
const searchButton = document.getElementById("submit");
const resultsContainer = document.getElementById("results");
 
function searchUsers(query) {
    console.log("query " + query);
  const filteredUsers = users.filter(user =>
    user.name.toLowerCase().includes(query.toLowerCase())
  );
}

1
2
3
4
5
6
7
8
9
searchButton.addEventListener("click", () => {
    console.log("typeof " + typeof searchInput);
    if(searchInput != '') {
        let searchInput2 = searchInput.toString();
        let query = searchInput2.value.trim();
        console.log("luego del addEventListener " + query);
        searchUsers(query);
    }
});

Lo que muestra la consola es esto:
searchInput [object HTMLInputElement]
query undefined
Uncaught TypeError: Cannot read properties of undefined (reading 'toLowerCase')
typeof object
Cannot read properties of undefined (reading 'trim')
at HTMLButtonElement.<anonymous> (
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Ivan

Cannot read properties of undefined (reading

Publicado por Ivan (118 intervenciones) el 06/04/2023 19:09:31
Hola,

aquí hay varias cosas que están mal.
Ayudaría más saber lo que quieres conseguir porque tu código es una mezcla de varios propósitos.

Para empezar, declaras constantes con valores que aún no existen porque el usuario no ha entrado ningún dato en el momento de declararlas.

Te falta el getElementById().value para obtener los valores.

Defines una función que recibe un parámetro searchUsers(query) y cuando la llamas en el evento onclick no se lo mandas.

Dentro de esta función llamas al objeto users y no se sabe de donde viene.

Como ves, demasiados errores para poderte ayudar sin saber qué buscas.

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de juan jose
Val: 42
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

Cannot read properties of undefined (reading

Publicado por juan jose (18 intervenciones) el 06/04/2023 19:50:51
1
2
3
4
5
6
function search (){
    let searchInput = document.getElementById("search").value.replace(/\s/g,'');
    console.log(searchInput);
    // falta la conexion y la query si es contra base de datos, obtener los usuarios
    // que coincidan e iterarlos para pintar el resultado
}

como dice ivan, son varios los errores, lo mas logico es que hagas una consulta a base de datos que te devuelva ya los usuarios filtrados.

y solo habria que colocar el nombre de la funcion en el onclick del boton en el html

salu2

pd.: console.log solo lo hago para que veas el valor de la variable segun hagas click en el boton.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

Cannot read properties of undefined (reading

Publicado por Jhon (4 intervenciones) el 07/04/2023 04:01:51
Ok, voy a poner lo que tengo y voy a explicar el propósito.

index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Búsqueda de Usuarios GitHub</title>
	<link rel="stylesheet" type="text/css" href="css/mystyles.css">
</head>
<body>
	<div class="finder">
		<h1>Búsqueda de Usuarios GitHub</h1>
 
        <div class="pseudo-search">
            <input type="text" id="search" placeholder="Buscar usuario..." value="">
		    <button id="submit" onclick="searchUsers()">Buscar</button>
        </div>
 
		<div id="results">
        </div>
 
	</div><!-- finder -->
</body>
<script src="js/myscript.js"></script>
</html>

myscript.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const users = [{
    "id": 1,
    "login": "mojombo",
    "avatar_url": "https://avatars.githubusercontent.com/u/1?v=4",
    "created_at": "2007-10-20T05:24:19Z",
    "name": "Tom Preston-Werner",
    "location": "San Francisco",
    "twitter_username": "mojombo",
    "blog": "http://tom.preston-werner.com",
    "public_repos": 63,
    "followers": 22827,
    "following": 11
},
{
    "id": 46,
    "login": "bmizerany",
    "avatar_url": "https://avatars.githubusercontent.com/u/46?v=4",
    "created_at": "2008-01-24T04:44:30Z",
    "name": "Blake Mizerany",
    "location": null,
    "twitter_username": null,
    "blog": "",
    "public_repos": 162,
    "followers": 1314,
    "following": 26
},
{
    "id": 45,
    "login": "mojodna",
    "avatar_url": "https://avatars.githubusercontent.com/u/45?v=4",
    "created_at": "2008-01-24T04:40:22Z",
    "name": "Seth Fitzsimmons",
    "location": "Bend, OR",
    "twitter_username": "mojodna",
    "blog": "http://mojodna.net/",
    "public_repos": 314,
    "followers": 534,
    "following": 114
},
{
    "id": 37,
    "login": "jamesgolick",
    "avatar_url": "https://avatars.githubusercontent.com/u/37?v=4",
    "created_at": "2008-01-19T22:52:30Z",
    "name": "James Golick",
    "location": "New York",
    "twitter_username": null,
    "blog": "http://jamesgolick.com",
    "public_repos": 110,
    "followers": 613,
    "following": 30
},
{
    "id": 18,
    "login": "wayneeseguin",
    "avatar_url": "https://avatars.githubusercontent.com/u/18?v=4",
    "created_at": "2008-01-13T06:02:21Z",
    "name": "Wayne E. Seguin",
    "location": "Buffalo, NY",
    "twitter_username": null,
    "blog": "",
    "public_repos": 98,
    "followers": 715,
    "following": 17
}
];
 
const searchInput = document.getElementById("search");
console.log("searchInput " + searchInput);
const searchButton = document.getElementById("submit");
const resultsContainer = document.getElementById("results");
 
function searchUsers(query) {
console.log("query " + query);
const filteredUsers = users.filter(user =>
user.name.toLowerCase().includes(query.toLowerCase())
);
 
if (filteredUsers.length === 0) {
resultsContainer.textContent = "No hay usuarios que cumplan con el criterio de búsqueda";
return;
}
 
const first = [];
first[0]= filteredUsers[0];
const resultsHtml = first.map(user => `
<div class="mycard">
<div class="myuser-card ">
<h2 class="myround">mojombo</h2>
<div>
    <img src=${user.avatar_url} width="115px" height="115px">
</div>
<div class="myround">
    ${user.created_at}
</div>
</div>
<div class="myadditional">
<h2>${user.name}</h2>
<div class="mycity-twitter">
    <div>${user.location}</div>
    <div>${user.twitter_username}</div>
</div>
http://tom.preston-werner
<div class="myrepos-followers">
    <div>
        <div>REPOS</div>
        <div>${user.public_repos}</div>
    </div>
    <div>
        <div>FOLLOWERS  </div>
        <div>${user.followers}</div>
    </div>
    <div>
        <div>FOLLOWING</div>
        <div>${user.following}</div>
    </div>
</div>
</div>
`).join("");
 
resultsContainer.innerHTML = resultsHtml;
}
 
searchButton.addEventListener("click", () => {
    let query = searchInput.value.trim();
    searchUsers(query);
});

mystyles.css

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
@import url('https://fonts.googleapis.com/css?family=Abel');
 
html, body {
	font-family: Abel, Arial, Verdana, sans-serif;
}
 
.finder {
	position: absolute;
	left: 50%;
	-webkit-transform: translate(-50%, 50%);
	transform: translate(-50%, 50%);
}
 
.finder h1 {
	font-size: 3em;
}
 
.pseudo-search {
	display: inline;
	border: 2px solid #ccc;
	border-radius: 100px;
	padding: 10px 15px;
	transition: background-color 0.5 ease-in-out;
}
 
.pseudo-search input {
	border: 0;
	background-color: transparent;
	width: 200px;
}
 
.pseudo-search input:focus {
	outline: none;
}
 
.finder input:focus {
	outline: none;
}
 
button, i {
	border: none;
	background: none;
	cursor: pointer;
}
 
.center {
	position: absolute;
	top: 50%;
	left: 50%;
	-webkit-transform: translate(-50%, -50%);
	transform: translate(-50%, -50%);
}
 
.card {
	width: 70%;
	height: 250px;
	background-color: #fff;
	background: linear-gradient(#f8f8f8, #fff);
	box-shadow: 0 8px 16px -15px rgba(0, 0, 0, 0.4);
	border-radius: 6px;
	overflow: hidden;
	position: relative;
	margin: 1.5rem;
}
 
.mycard {
	width: 110%;
	height: 250px;
	background-color: #fff;
	background: linear-gradient(#f8f8f8, #fff);
	box-shadow: 0 8px 16px -15px rgba(0, 0, 0, 0.4);
	border-radius: 6px;
	overflow: hidden;
	position: relative;
	margin: 1.5rem;
	display: flex;
	color: white;
	font-weight: bold;
}
 
.mycard .myadditional {
	/*position: absolute;*/
	width: 250%;
	height: 100%;
	background-color: #6aa4ca;
	background: linear-gradient(#566b92, #6aa4ca);
	transition: width 0.4s;
	overflow: hidden;
	z-index: 2;
	text-align: center;
 
}
 
.mycard .myuser-card {
	width: 170%;
	height: 100%;
	position: relative;
	float: left;
	background-color: #648373ab;
	display: grid;
    place-content: center;
	text-align: center;
}
 
.myround {
	background-color:#224C36;
	border-radius: 30px;
	width: 110px;
	padding: 1px 10px;
 
}
 
.mycity-twitter {
	display: flex;
	justify-content: space-between;
	padding-left: 20px;
	padding-right: 25px;
	padding-bottom: 25px;
}
 
.myrepos-followers {
	display: flex;
	justify-content: space-between;
	padding-left: 20px;
	padding-right: 25px;
	padding-bottom: 25px;
	padding-top: 25px;
}

La idea es buscar por name en ese json y retornar la información en un card
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Ivan

Cannot read properties of undefined (reading

Publicado por Ivan (118 intervenciones) el 07/04/2023 10:46:32
Hola de nuevo Jhon,

mucho mejor así jeje

Te alegrará saber que tu código funciona perfectamente ;)

El único error, como dije antes, es que la función searchUsers() espera recibir el parámetro "query" que es el valor del input, pero no se lo pasas en el evento onclick.

1
<button id="submit" onclick="searchUsers(document.getElementById('search').value)">Buscar</button>

Cambiándolo así todo arreglado.

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jhon

Cannot read properties of undefined (reading

Publicado por Jhon (4 intervenciones) el 07/04/2023 17:46:48
Gracias Iván !
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar