デフォルトの「ビジー」スピナー(他のajax呼び出しで表示されるもの)にフックするgrailsに真の非同期/ajaxファイルアップロードはありますか?
または、ファイルのアップロード中にそのスピナーを表示したい場合は、明示的に呼び出す必要がありますか?
デフォルトの「ビジー」スピナー(他のajax呼び出しで表示されるもの)にフックするgrailsに真の非同期/ajaxファイルアップロードはありますか?
または、ファイルのアップロード中にそのスピナーを表示したい場合は、明示的に呼び出す必要がありますか?
これは、交換の背後にある複雑さと制限のいくつかのために、通常、サードパーティからの助けを 必要とするものの1つです。
これを実現するためにFlashを使用するjqueryで使用できるプラグインもありますが、Flashを使用するものは避けたいと思います(個人的な好み)。Valums Ajaxをチェックしてください-アップロード私はこれを生産サイトで約1年間使用しましたが、うまく機能し、使いやすかったです。プラグインについての私のお気に入りは、ほとんどすべてのサイトのデザインとレイアウトに邪魔にならないことです。
また、これはよくある質問です。これらの答えもチェックしてください...
ジェフ、
私はこのようにコーディングします...
コードに自分自身を表示したい場合は、スピナーを呼び出す必要があります。画像を表示したい場合。
XMLHttpRequest を使用できます。これは、ドラッグ アンド ドロップを含めて行ったプロジェクトの完全なコードです。
<div id="drop_zone">Drag and drop your file here or click</div>
<input id="curriculumUploader" type="file" name="curriculum" style="display:none;"/>
function uploadCurriculum(file) {
var xmlhttp;
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
//FormData will contain the post params
var form = new FormData();
xmlhttp.onreadystatechange = function() {
//Handle response if everything is right
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
//This is the element where i will put my response
var element = document.getElementById('curriculum');
//The response is given in the property responseText
element.innerHTML = xmlhttp.responseText;
//If you response has javascript elements, you need to place them in the header to make client compile them
var scriptElements = element.getElementsByTagName('SCRIPT');
for (i = 0; i < scriptElements.length; i ++) {
var scriptElement = document.createElement('SCRIPT');
scriptElement.type = 'text/javascript';
if (!scriptElements[i].src) {
scriptElement.innerHTML = scriptElements[i].innerHTML;
} else {
scriptElement.src = scriptElements[i].src;
}
document.head.appendChild(scriptElement);
}
}
}
//Put your params in the url if you want to send them by GET
xmlhttp.open("POST", window.appContext + "/controller/action/" + someParams, true);
xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
//add the file to the form to send by POST
form.append('curriculum', file);
xmlhttp.send(form);
}
function handleFileSelect(event) {
handleDragOver(event);
var files = event.target.files || event.dataTransfer.files;
if (files.length > 0) {
parseFile(files[0]);
}
}
function handleDragOver(event) {
event.stopPropagation();
event.preventDefault();
if (event.type == "dragover") {
event.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
addClass(event.target, "hover");
} else {
removeClass(event.target, "hover");
}
}
function showFileSelect() {
document.getElementById('curriculumUploader').click();
}
function parseFile(file) {
if (file != null && file.size > 0) {
uploadCurriculum(file)
} else {
console.log('Invalid file');
}
}
// Setup the dnd listeners.
var dropZone = document.getElementById('drop_zone');
if (dropZone != null) {
dropZone.addEventListener('dragover', handleDragOver, false);
dropZone.addEventListener("dragleave", handleDragOver, false);
dropZone.addEventListener('drop', handleFileSelect, false);
dropZone.addEventListener('click', showFileSelect, false);
}
var inputelement = document.getElementById('curriculumUploader');
inputelement.addEventListener('change', handleFileSelect, false);
#drop_zone {
padding: 15px;
text-align: center;
border: 1px dashed #4b9df2;
color: #4b9df2;
cursor: pointer;
transition: all linear 0.2s;
}
#drop_zone.hover {
border: 1px dashed #C99F23;
color: #C99F23;
}