web-dev-qa-db-fra.com

Uncaught TypeError: .indexOf n'est pas une fonction

Je suis nouveau dans JavaScript et j'obtiens une erreur comme ci-dessous.

Uncaught TypeError: time.indexOf n'est pas une fonction

Gee, je pensais vraiment que indexOf () était vraiment une fonction. Voici un extrait de mon code:

    var timeofday = new Date().getHours() + (new Date().getMinutes()) / 60;
    document.getElementById("oset").innerHTML = timeD2C(timeofday);
</script>


<script>
 function timeD2C(time) { // Converts 11.5 (decimal) to 11:30 (colon)
    var pos = time.indexOf('.');
    var hrs = time.substr(1, pos - 1);
    var min = (time.substr(pos, 2)) * 60;

    if (hrs > 11) {
        hrs = (hrs - 12) + ":" + min + " PM";
    } else {
        hrs += ":" + min + " AM";
    }
    return hrs;
}
</script>
16
TerryO

indexOf() est une méthode qui appartient à string (objet tableau également), mais lorsque vous appelez la fonction, vous transmettez un nombre, essayez de le convertir en chaîne et de le transmettre.

document.getElementById("oset").innerHTML = timeD2C(timeofday + "");

 var timeofday = new Date().getHours() + (new Date().getMinutes()) / 60;




 function timeD2C(time) { // Converts 11.5 (decimal) to 11:30 (colon)
    var pos = time.indexOf('.');
    var hrs = time.substr(1, pos - 1);
    var min = (time.substr(pos, 2)) * 60;

    if (hrs > 11) {
        hrs = (hrs - 12) + ":" + min + " PM";
    } else {
        hrs += ":" + min + " AM";
    }
    return hrs;
}
alert(timeD2C(timeofday+""));


Et il est bon de faire la conversion de chaîne dans la définition de votre fonction,

function timeD2C(time) { 
  time = time + "";
  var pos = time.indexOf('.');

Ainsi, le flux de code ne sera pas interrompu lorsque les développeurs oublient de passer une chaîne dans cette fonction.

Convertissez timeofday en chaîne pour utiliser indexOf

var timeofday = new Date().getHours() + (new Date().getMinutes()) / 60;
console.log(typeof(timeofday)) // for testing will log number
function timeD2C(time) { // Converts 11.5 (decimal) to 11:30 (colon)
    var pos = time.indexOf('.');
    var hrs = time.substr(1, pos - 1);
    var min = (time.substr(pos, 2)) * 60;

    if (hrs > 11) {
        hrs = (hrs - 12) + ":" + min + " PM";
    } else {
        hrs += ":" + min + " AM";
    }
    return hrs;
}
 // "" for typecasting to string
 document.getElementById("oset").innerHTML = timeD2C(""+timeofday);

Testez ici

Solution 2

utilisez toString() pour convertir en string

document.getElementById("oset").innerHTML = timeD2C(timeofday.toString());

jsfiddle avec toString ()

5
brk

J'ai récemment rencontré cette erreur en utilisant une bibliothèque javascript qui modifie les paramètres d'une fonction en fonction de conditions.

Vous pouvez tester un objet pour voir s'il a la fonction. Je ne le ferais que dans les cas où vous ne contrôleriez pas ce qui vous est transmis.

if( param.indexOf != undefined ) {
   // we have a string or other object that 
   // happens to have a function named indexOf
}

Vous pouvez le tester dans la console de votre navigateur:

> (3).indexOf == undefined;
true

> "".indexOf == undefined;
false
0
Andrew Grothe