SCRIPT438: L'objet ne supporte pas la propriété ou la méthode IE
j'ai une option dans mon application où les utilisateurs peuvent désactiver leur profils. Seul l'administrateur peut activer de nouveau.
j'ai une classe ActivateProfile
avec deux méthodes
-
userExist(userName)
qui vérifie si l'utilisateur avec ce nom d'utilisateur existe et son profil est désactivé - et
activateAccountByUser(userName)
qui activent le profil de l'utilisateur à nouveau
j'appelle une fonction JavaScript sur l'événement click d'un bouton de type. Ce code fonctionne très bien sur Chrome et Mozilla, mais sur Internet Explorer je reçois cette erreur:
SCRIPT438: Objet ne prend pas en charge la propriété ou de la méthode userExist
function activateProf() {
var userName=document.getElementById("userName").value;
if (userName == "") {
alert("Полето е задолжително");
} else {
alert(userName + "1");
ActivateProfile.userExist(userName, { callback:function(exist) {
if (userName) {
ActivateProfile.activateAccountByUser(userName);
alert("User is activated");
} else {
alert("User does not exist");
}
}});
}
}
voici le code pour activer la classe de profil
public void activateAccountByUser(String userName) {
try {
Connection c = DBComm.getInstance().getConnection();
Statement s = c.createStatement();
ResultSet set = s.executeQuery("select * from accounts where userName = '" + userName + "' and isauthorized='2'");
if (set.next()) {
Statement st = c.createStatement();
st.executeUpdate("update accounts set isauthorized='1' where userName='" + userName + "' and isauthorized='2'");
}
s.close();
c.close();
} catch (Exception ex) {
java.util.logging.Logger.getLogger(ActivateProfile.class.getName()).log(Level.SEVERE, null, ex);
}
}
public boolean userExist(String userName) throws SQLException {
//true exist
//false does not exist
boolean existEmbg = false;
try {
Connection c = DBComm.getInstance().getConnection();
Statement s = c.createStatement();
ResultSet set = s.executeQuery("select * from accounts where userName = '" + userName + "' and isauthorized='2'");
if (set.next()) {
existEmbg = true;
} else {
existEmbg = false;
}
s.close();
c.close();
} catch (Exception ex) {
java.util.logging.Logger.getLogger(ActivateProfile.class.getName()).log(Level.SEVERE, null, ex);
}
return existEmbg;
}
9 réponses
après quelques jours de recherche sur Internet, j'ai constaté que cette erreur se produit généralement lorsqu'un élément html id a le même id qu'une variable de la fonction javascript. Après la modification du nom de l'un d'eux mon code fonctionnait bien.
C'est un problème courant dans les applications web qui emploient JavaScript namespacing. Quand c'est le cas, le problème 99,9% du temps est L'incapacité de IE à lier les méthodes dans l'espace de noms courant au mot-clé "this".
par exemple, si j'ai L'espace de noms JS" StackOverflow "avec la méthode"isAwesome". Normalement, si vous êtes dans l'espace de noms "Stackoverlow", vous pouvez invoquer la méthode "isAwesome" avec la syntaxe suivante:
this.isAwesome();
Chrome, Firefox et Opera accepteront volontiers cette syntaxe. C'est-à-dire que d'un autre côté, non. Ainsi, le pari le plus sûr lors de L'utilisation de l'espace de noms JS est de toujours préfixer avec l'espace de noms réel. A la:
StackOverflow.isAwesome();
j'ai ajouté var pour toutes les variables dans le JavaScript correspondant. Cela a résolu le problème dans IE.
Code Précédent
billableStatus = 1 ;
var classStr = $(this).attr("id").split("_");
date = currentWeekDates[classStr[2]]; // Required
activityNameId = "initialRows_" + classStr[1] + "_projectActivityName";
activityId = $("#"+activityNameId).val();
var projectNameId = "initialRows_" + classStr[1] + "_projectName" ;
projectName = $("#"+projectNameId).val();
var timeshitEntryId = "initialRows_"+classStr[1]+"_"+classStr[2];
timeshitEntry = $("#"+timeshitEntryId).val();
Nouveau Code
var billableStatus = 1 ;
var classStr = $(this).attr("id").split("_");
var date = currentWeekDates[classStr[2]]; // Required
var activityNameId = "initialRows_" + classStr[1] + "_projectActivityName";
var activityId = $("#"+activityNameId).val();
var projectNameId = "initialRows_" + classStr[1] + "_projectName" ;
var projectName = $("#"+projectNameId).val();
var timeshitEntryId = "initialRows_"+classStr[1]+"_"+classStr[2];
var timeshitEntry = $("#"+timeshitEntryId).val();
mon problème était d'avoir type="application/javascript"
sur l'étiquette <script>
pour jQuery. IE8 n'aime pas ça! Si votre page web est HTML5 vous n'avez même pas besoin de déclarer le type, sinon allez avec type="text/javascript"
à la place.
dans mon cas, j'avais le code suivant:
function.call(context, arg);
j'ai eu un message d'erreur sous IE
TypeError: Objet ne prend pas en charge la propriété ou de la méthode "erreur"
dans le corps de "fonction" que j'avais " console.erreur" et il s'avère que la console est indéfini lorsque votre console est fermée. J'ai corrigé cela en vérifiant si la console et la console.erreur définie
j'ai oublié d'utiliser var
sur mon élément variable
code Incorrect:
var itemCreateInfo = new SP.ListItemCreationInformation();
item = list.addItem(itemCreateInfo);
item.set_item('Title', 'Haytham - Oil Eng');
code Correct:
var itemCreateInfo = new SP.ListItemCreationInformation();
var item = list.addItem(itemCreateInfo);
item.set_item('Title', 'Haytham - Oil Eng');
implémenter "use strict"
dans toutes les balises de script pour trouver des incohérences et corriger des variables potentielles non contrôlées!
ce problème peut se produire en raison de la version incorrecte de jquery. comme 1.4 etc. où faire la méthode n'est pas pris en charge
j'ai eu la suivante
document.getElementById("search-button") != null
qui a bien fonctionné dans tous les navigateurs, sauf ie8. ( Je n'ai pas vérifier ie6 ou ie7)
Je l'ai changé en
document.getElementById("searchBtn") != null
et mis à jour l'attribut id sur le champ dans mon html et il fonctionne maintenant dans ie8