Sur le bouton
, faites un clic droit dont j'ai besoin:
- masquer le bouton
- puis afficher une invite
- écrivez la valeur d'invite
- obtenir la valeur dans la console
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button class='cmenu'>CLICK</button>
function a_ren(){ var a = 'lorem'; $('.cmenu').hide(function(){var res = prompt('RENAME', a);}); console.log(res); } $(document).on('contextmenu', 'button', function(e){ e.preventDefault(); a_ren(); });
Deux problèmes:
- erreur de console - res
n'est pas défini
- ici sur SO
la fenêtre d'invite apparaît mais sur ma page ( chrome
, localhost
) la fenêtre d'invite n'apparaît pas du tout.
Avez-vous de l'aide?
3 Réponses :
La raison pour laquelle res
n'est pas défini est que la fonction passée à hide ()
ne s'exécute qu'après la fin de l'animation de masquage mais console.log ( res);
est appelé sans attendre. De plus, comme l'a souligné Ram Segev, res
est défini dans la fonction de rappel hide
de sorte que c'est le seul endroit dans sa portée (accessible).
Comme pour l'invite non apparaissant, essayez de remplacer
document.querySelector('button').addEventListener('contextmenu', (e) => {
par
$(document).on('contextmenu', 'button', function(e){
res
n'est pas défini car vous le déclarez dans la fonction hide
et essayez de l'imprimer en dehors de celui-ci (pas dans la portée). Mettez le journal de la console dans la fonction et cela devrait le résoudre.
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button class='cmenu'>CLICK</button>
function a_ren(){ var a = 'lorem'; $('.cmenu').hide(function(){ var res = prompt('RENAME', a); console.log(res); }); } $(document).on('contextmenu', 'button', function(e){ e.preventDefault(); a_ren(); });
Le problème est que la portée de var res
est à l'intérieur du callback hide complete, même si vous déclarez res en dehors de la fonction, vous n'obtiendrez pas la valeur de l'invite car le callback hide complete est asynchrone , vous devez donc traiter le résultat de l'invite dans le rappel lui-même, reportez-vous au code suivant
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button class='cmenu'>CLICK</button>
function a_ren() { var a = 'lorem'; $('.cmenu').hide(function () { var res = prompt('RENAME', a); process_prompt_result(res); // scope of res ends here, its undefined outside this function }); } $(document).on('contextmenu', 'button', function (e) { e.preventDefault(); a_ren(); }); function process_prompt_result(result) { // do something thing with result value from prompt console.log(result); }
Question bien écrite ^^