Sto provando a utilizzare a livello di codice execCommand in Chrome (Build 43) per copiare il risultato di una richiesta JSONP asincrona negli Appunti. Ecco un snippet della logica:Come copiare a livello di codice il contenuto dipendente asincrono negli Appunti dopo un clic?
loadContent()
function loadContent(callback) {
$.getJSON('http://www.randomtext.me/api/lorem/p-5/10-20?&callback=myFunc',function(result){
console.log('result=',result.text_out);
$("#container").html(result.text_out);
if (callback) {
callback();
}
});
}
function copyAjax() {
loadContent(copy);
}
function copy() {
var copyDivText = $('#container').text();
console.log('copyDivText=',copyDivText);
executeCopy(copyDivText);
}
document.addEventListener("DOMContentLoaded", function(){
document.getElementById("copy").onclick = copy;
});
document.addEventListener("DOMContentLoaded", function(){
document.getElementById("copyAjax").onclick = copyAjax;
});
// Copy text as text
function executeCopy(text) {
var input = document.createElement('textarea');
document.body.appendChild(input);
input.value = text;
input.focus();
input.select();
document.execCommand('Copy');
input.remove();
}
So che a partire costruire 43 di Chrome si utilizza il codice di execCommand con appunti. Il problema, tuttavia, è che è necessario farlo nell'esecuzione di un evento originato dall'utente (in cui le autorizzazioni sono elevate). Questa è una restrizione simile a quella della soluzione basata su flash ZeroClipboard. eccezione di ottenere una risposta che non è possibile (che è quello che rifletto circa ora), queste sono le altre opzioni ho pensato di fare come ultima risorsa (attenzione, sono tutti Hail Mary Passes):
- Dal JSONP non può essere sincrono, trasformarlo in qualcosa che utilizza una normale chiamata AJAX e assicurarsi che la chiamata AJAX sia sincrona all'interno del contesto di esecuzione dell'evento utente. Questo va contro la mia convinzione profondamente radicata che non dovremmo fare chiamate XHR sincrone poiché peggiora l'esperienza dell'utente.
- Mentre l'utente si avvicina al pulsante di copia con il mouse, inviamo preventivamente la richiesta del server e speriamo che sia abbastanza veloce prima che l'utente faccia clic sul pulsante. Questa è una condizione di gara ovvia che potrebbe non far parte del tempo e non funzionerà per certo quando l'uso vuole eseguire un Ctrl/Comando-C invece di fare clic sul pulsante Copia.
- Eseguire una procedura in due passaggi. Un clic per attivare la chiamata, quando il contenuto è disponibile, mostrare un messaggio il contenuto è disponibile e premere un altro clic nell'area del messaggio per copiare negli appunti. Non sembra la migliore interazione UX di sempre. Ho creato this example con questa alternativa. L'attivazione di un clic a livello di codice non costituisce un evento relativo ai problemi degli utenti.
- Potrebbe esserci un modo per creare una semplice estensione di Chrome e consentire all'utente di impostare l'autorizzazione per tale estensione da copiare negli Appunti. Ciò implica che l'utente finale deve installare ed estendere e modificare le impostazioni del browser locale. Non sono sicuro che molti utenti saranno in grado/disposti a farlo.
Ho già esaminato le domande StackOverflow come this, ma non affrontano uno scenario asincrono. Per favore fatemi sapere se è possibile trovare qualsiasi altra soluzione praticabile (o un tweak su quello esistente).
Ti è venuta in mente qualche altra idea per questo? Ho la situazione esatta, in cui un utente richiede di copiare e ho bisogno di fare un viaggio di andata e ritorno al server per recuperare i dettagli da un DB. L'utilizzo del tuo suggerimento 3 sembra il migliore dei 4 mali :(.... – pythonator
> 2. Esegui un processo in due fasi: L'ho implementato di recente.L'UX di base è che quando l'utente fa clic sul pulsante "Ottieni link", si effettua la richiesta Ajax e si visualizza una casella di selezione. Una volta che la richiesta è terminata, viene visualizzato un input di testo insieme a un piccolo pulsante di copia accanto ad esso (come l'icona di input ante input cst di bootstrap). Assicurati che il testo sia selezionato automaticamente nell'input. Facendo clic sull'icona si dovrebbe copiare negli appunti dell'utente. È possibile modificare le interazioni per renderlo il più piacevole possibile, dati i vincoli (ad esempio, ho reso l'input selezionare tutto il testo su focusIn). – les2