1
votes

impossible d'obtenir une variable à partir d'une invite comme fonction de rappel

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?


1 commentaires

Question bien écrite ^^


3 Réponses :


0
votes

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){


0 commentaires

1
votes

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();
});


0 commentaires

1
votes

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);
}


0 commentaires