Je développe une application sur une seule page, j'ai un bouton sur la page, lorsqu'un utilisateur clique sur le bouton, je souhaite effectuer un appel ajax vers mon serveur, puis copier la valeur retournée (via rappel) dans le presse-papiers de l'utilisateur.
Chaque composant fonctionne de manière isolée, mais lorsque je les colle ensemble, Firefox renvoie l'erreur suivante:
document.execCommand ("couper"/"copier") a été refusé car il n'a pas été appelé depuis l'intérieur d'un gestionnaire d'événements généré par l'utilisateur de courte durée
Je voudrais connaître les détails de cette erreur, mais il n'y a absolument aucune information en ligne; quelles sont les conditions limites qui déclenchent cette erreur, est-ce une profondeur de pile, un timeout, etc.?
Enveloppez votre appel execCommand('cut'/'copy')
avec demande asynchrone pour l'exécuter après le user event
le traitement est terminé.
Exemple avec $.Deferred
:
function asyncCall() {
return $.Deferred().resolve().promise();
}
asyncCall().then(function() {
var supported = document.queryCommandSupported('copy');
if (supported) {
// ... select action
document.execCommand('copy');
}
});
Je devais juste régler ce problème.
Pour moi, la solution a simplement été définie sur async sur false, car l'appel est assez rapide.
Vous pouvez voir le lien sur le presse-papiers. Sinon, vous utilisez synchrone. Exemple:
$.ajax({
method: "GET",
async: false,
url: {your_url},
success: function(res) {
let link= res.link;
let temp_raw = $("<input>");
$("body").append(temp_raw);
temp_raw.val(link);
temp_raw.select();
document.execCommand("copy");
temp_raw.remove();
}
});