Estoy tratando de crear una verificación que busque ver si un campo ha cambiado del valor del marcador de posición. Si no es así, reasigno el valor changed
original, ya que la función (en mi base de código real) tiene que mirar varios campos.
Estoy un poco confundido por qué:
changed = (locationField.value && locationField.value !== locationField.placeholder) ? true : changed;
está evaluando a una cadena vacía* si el campo se envía sin valor.
* salida al final de la publicación
Supongo que es el valor vacío de locationField.value
, pero ¿no debería estar asignando 'verdadero' o el valor de cambiado? Cambiado (por lo que puedo ver) nunca es, y nunca debería ser una cadena.
Probablemente una pregunta simple, pero no puedo ver la respuesta.
const locationField = document.querySelector('.location'); const submit = document.querySelector('.submit'); let changed = false; submit.addEventListener('click', e => { changed = (locationField.value && locationField.value !== locationField.placeholder) ? true : changed; console.log(locationField.value, locationField.placeholder, (locationField.value && locationField.value !== locationField.placeholder)); console.log(changed); // reset changed = false; });
<input type="text" placeholder="test" class="location"> <button class="submit">Submit</button>
** EDITAR:
Resultados que obtengo:
entrada "cambiado" => "changed", "test", true
entrada "prueba" => "test", "test", false
entrada "" "", "test", ""
, cuando esperaría "", "test", false
AND lógico (&&) evalúa los operandos de izquierda a derecha, regresando inmediatamente con el valor del primer operando falso que encuentra; si todos los valores son verdaderos, se devuelve el valor del último operando.
(fuente: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND )
Entonces, en su caso, si locationField.value
es "", que se evalúa como un valor falso, entonces lógico Y devolverá el valor de locationField.value
(por eso devuelve una cadena vacía)
Si primero conviertes locationField.value
a un valor booleano, ya sea con !!
o con Boolean()
, entonces debería obtener el resultado esperado.
(!!locationField.value && locationField.value !== locationField.placeholder)