Ci-dessous, j'ai un simple dialogue modal script sur lequel je travaille. Il utilise Bootstrap Modal pour le côté CSS de la chose.
Mon objectif était de créer une simple boîte de dialogue modale qui s'affiche et requiert une action de la part de l'utilisateur (clic sur le bouton ok ou annuler). Je voulais le rendre flexible pour une utilisation dans de futurs projets en permettant à certaines fonctions de rappel d'être passées et appelées lorsque ces événements de clic ont lieu. Il y a aussi d'autres options comme afficher ou non le bouton d'annulation. (Je n'ai pas encore ajouté cette partie).
Ce que je fais donc, c'est que la fonction accepte un objet d'options/de paramètres. J'ai également des options/réglages par défaut dans lesquels les options de l'utilisateur se fondent, ce qui permet aux options de l'utilisateur d'être facultatives et de remplacer les options par défaut si elles sont présentes.
Je sais qu'il existe plusieurs façons de procéder, mais c'est la méthode que j'ai vue dans quelques projets étudiés par des développeurs JS que je respecte.
Voici donc mon code JavaScript, une page JSFiddle avec le code, et une page JSFiddle Output pour voir le résultat.
Dans le code, à mi-chemin, il y a un commentaire // PROBLEM AREA DOES NOT CALL THE CALLBACK FUNCTION
Dans ce domaine, j'ai essayé 3 choses différentes jusqu'à présent...
this.options.cancelCallback(); // This is what I wanted to work!
zPanel.dialog.confirm.options.cancelCallback(); Tried this 2nd
options.cancelCallback(); // This Works if there is a user defined callback but errors when not
Donc mon problème dans ce domaine en ce moment est que lorsque j'appelle this.options.cancelCallback()
dont DEVRAIT contient la fonction de rappel, si l'utilisateur en a passé une, elle devrait être réaffectée à cette propriété, si l'utilisateur ne l'a pas fait, il devrait au moins voir une propriété vide par défaut.
Je pense que le this
La partie est malencontreuse car elle se trouve à l'intérieur de la fonction onclick qui, d'ailleurs, ne ressemble pas à un événement de clic normal, je l'ai vu dans un autre projet et cela "fonctionnait".
Le message d'erreur que je reçois est donc Uncaught TypeError: Cannot call method 'okCallback' of undefined
Quelqu'un peut-il me montrer comment contourner ce problème ou l'améliorer ? Merci.
JSFiddle http://jsfiddle.net/jasondavis/dymn5/
Aperçu plein écran http://jsfiddle.net/jasondavis/dymn5/show/result/
var zPanel = {
dialog: {
confirm: function (options) {
var i;
// Default options
this.options = {
message: "", // String: Default Message
cancelButton: true, // Boolean: Show Cancel Button
okButton: true, // Boolean: Show Ok Button
cancelCallback: function () {}, // Function: Callback function when Cancel button clicked
okCallback: function () {} // Function: Callback function when Ok button clicked
};
// Merge User defined options
for(i in options) {
if(i in this.options) {
this.options[i] = options[i];
} else {
throw new Error("Notice doesn't support option: " + i);
}
}
var container = document.createElement('div');
//template for modal window
container.innerHTML += '<div class="modal-content confirm">' +
'<div class="modal-body">' +
'<div>' + this.options.message + '</div>' +
'<div class="controls">' +
'<button type="button" class="btn primary">OK</button>' +
'<button type="button" class="btn">Cancel</button>' +
'</div>' +
'</div>' +
'</div>';
//modal window
var modal = container.firstChild;
container = document.createElement('div');
container.innerHTML = '<div class="modal-backdrop fade in"></div>';
//dark background
var background = container.firstChild;
//Find OK button
var ok = modal.getElementsByTagName('button')[0];
ok.onclick = function () {
modal.parentNode.removeChild(modal);
document.body.removeChild(background);
// PROBLEM AREA DOES NOT CALL THE CALLBACK FUNCTION
this.options.okCallback();
//zPanel.dialog.confirm.options.okCallback();
//options.okCallback(); // Works if there is a user defined callback
}
//Find Cancel button
var cancel = modal.getElementsByTagName('button')[1];
cancel.onclick = function () {
modal.parentNode.removeChild(modal);
document.body.removeChild(background);
// PROBLEM AREA DOES NOT CALL THE CALLBACK FUNCTION
this.options.cancelCallback();
//zPanel.dialog.confirm.options.cancelCallback();
//options.cancelCallback(); // Works if there is a user defined callback
}
document.body.appendChild(background);
document.body.appendChild(modal);
}
}
}
// Create a Dialog on Click event
$('#delete_btn').click(function () {
zPanel.dialog.confirm({
message: 'Are you sure you want to delete action?',
cancelCallback: function(){alert('user pressed Cancel button')},
okCallback: function () {alert('id deleted')},
});
});