J'ai une option dans mon application où les utilisateurs peuvent désactiver leurs profils. Seul l'administrateur peut les réactiver.
J'ai une classe ActivateProfile
avec deux méthodes
userExist(userName)
qui vérifie si l'utilisateur avec ce nom d'utilisateur existe et si son profil est désactivéactivateAccountByUser(userName)
qui réactive le profil de l'utilisateurJ'appelle une fonction JavaScript sur l'événement click d'un bouton de type d'entrée. Ce code fonctionne bien sur Chrome et Mozilla, mais sur Internet Explorer, j'obtiens cette erreur:
SCRIPT438: L'objet ne prend pas en charge la propriété ou 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;
}
Après quelques jours de recherche sur Internet, j'ai constaté que cette erreur se produisait généralement lorsqu'un identifiant d'élément html avait le même identifiant que certaines variables de la fonction javascript. Après avoir changé le nom de l'un d'eux, mon code fonctionnait bien.
Il s'agit d'un problème courant dans les applications Web qui utilisent un espacement de nom JavaScript. Lorsque tel est le cas, le problème réside 99,9% du temps dans l'incapacité d'IE à lier les méthodes de l'espace de noms actuel 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 "StackOverflow", vous pouvez appeler la méthode "isAwesome" avec la syntaxe suivante:
this.isAwesome();
Chrome, Firefox et Opera accepteront volontiers cette syntaxe. IE d'autre part, ne sera pas. Ainsi, le pari le plus sûr lors de l'utilisation de l'espacement de noms JS est de toujours préfixer avec l'espace de noms réel. À 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 la balise <script>
pour jQuery. IE8 n'aime pas ça! Si votre page Web est en HTML5, vous n'avez même pas besoin de déclarer le type, sinon utilisez plutôt type="text/javascript"
.
Dans mon cas, j'avais un code comme celui-ci:
function.call(context, arg);
J'ai un message d'erreur sous IE
TypeError: l'objet ne prend pas en charge la propriété ou la méthode 'erreur'
Dans le corps de 'fonction' j'avais "console.error" et il devient cet objet console indéfini lorsque votre console est fermée. J'ai corrigé cela en vérifiant si console et console.error sont définis
Implémentez "use strict"
dans toutes les balises de script pour rechercher les incohérences et réparer les variables non traitées!
Nous avons pu résoudre ce problème en ajoutant dans le fichier polyfill Object.Assign les fichiers importés et en renvoyant l'erreur. Nous en ferions la plus grande importation, de cette façon, il serait disponible pour l'autre code appelé dans la pile.
import "mdn-polyfills/Object.assign";
J'ai oublié d'utiliser var
sur ma variable d'item
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');