Ajax调用半工作模式。。。已上载文件,但未执行javascript
我很抱歉这个问题,但我有一个持续的错误,我不明白到底发生了什么 我有一个ajax上传功能,工作正常Ajax调用半工作模式。。。已上载文件,但未执行javascript,javascript,ajax,file,upload,callback,Javascript,Ajax,File,Upload,Callback,我很抱歉这个问题,但我有一个持续的错误,我不明白到底发生了什么 我有一个ajax上传功能,工作正常 function startUp(hash) { $('#file_up_form').ajaxForm({ beforeSend: function(xhr) { xhr.setRequestHeader("X-CSRF-Token", '{{ Ses
function startUp(hash) {
$('#file_up_form').ajaxForm({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-CSRF-Token", '{{ Session::token() }}' );
xhr.setRequestHeader('Sha-Sha',hash);
//other stuff
},
uploadProgress: function(event, position, total, percentComplete) {
//some stuff
},
complete : function(xhr) {
//some stuff
},
error : function(xhr) {
//some stuff
}
});
}
当我这样称呼它时:
$("#start_up_button").on('click', function() {
if(checkFile()){
startUp('f4274dd2284704f1158b2cecd71666a37ba5b949f97fc521974f98fa3dd0ea706cca7253244e20f2a4c4c694052097c45260edfe679c9e7b56896858a34839cd');
//getHash();
}
else{
$('#myModalerror').modal('show');
$("#myModalerror").css("z-index", "1500");
}
});
一切正常。
但是,当我取消注释第二行并注释第一行时,我将从中调用它:
function getHash(){
input = document.getElementById('fileToUpload');
file = input.files[0];
var reader = new FileReader();
reader.onload = function(e) {
var shaObj = new jsSHA(reader.result,"BYTES");
var hash = shaObj.getHash("SHA-512", "HEX");
console.log(hash);
startUp(hash);
};
reader.readAsBinaryString(file);
}
ajax不起任何作用:console.log显示正确的哈希,但没有设置任何头,并且“//some stuff”中的任何内容都不起作用。。。但是文件被上传了!!(??)我试着用一个字母来结束这个电话
setTimeout(function() {
startUp(hash);
}, 200);
但Firefox只是崩溃了。有什么想法吗
thx在
$('#file_up_form')中ajaxForm()
的行为。ajaxForm({…})是而不是触发AJAX请求
它是一个事件绑定函数。(我没有看过API文档,但它可能将表单提交事件绑定到其内部库函数之一)
要真正触发AJAX请求,您必须在HTML
中添加一个
按钮,然后单击它。(库将阻止传统表单提交,并通过AJAX提交)
实施示例:
<script type="text/javascript">
$(document).ready(function(){
$("#file_up_form").ajaxForm({ // bind library function to the form
beforeSend: function(xhr){
input = document.getElementById('fileToUpload');;
file = input.files[0];
if(file){
var reader = new FileReader();
reader.readAsBinaryString(file);
var shaObj = new jsSHA(reader.result,"BYTES");
var hash = shaObj.getHash("SHA-512", "HEX");
xhr.setRequestHeader('Sha-Sha', hash);
}else{
alert("First, please select a file to upload.");
return false;
}
},
uploadProgress: function(event, position, total, percentComplete){ },
success: function() { },
complete: function(response) { },
error: function() { }
});
});
</script>
<body>
<form id="file_up_form" action="upload.php" method="post">
<input type="file" id="fileToUpload" name="uploadedfile" />
<!-- Click on submit to perform AJAX call -->
<input type="submit" value="Upload">
</form>
</body>
JS:
<script type="text/javascript">
$(document).ready(function(){
$("#file_up_form").ajaxForm({ // bind library function to the form
beforeSend: function(xhr){
input = document.getElementById('fileToUpload');;
file = input.files[0];
if(file){
var reader = new FileReader();
reader.readAsBinaryString(file);
var shaObj = new jsSHA(reader.result,"BYTES");
var hash = shaObj.getHash("SHA-512", "HEX");
xhr.setRequestHeader('Sha-Sha', hash);
}else{
alert("First, please select a file to upload.");
return false;
}
},
uploadProgress: function(event, position, total, percentComplete){ },
success: function() { },
complete: function(response) { },
error: function() { }
});
});
</script>
<body>
<form id="file_up_form" action="upload.php" method="post">
<input type="file" id="fileToUpload" name="uploadedfile" />
<!-- Click on submit to perform AJAX call -->
<input type="submit" value="Upload">
</form>
</body>
$(文档).ready(函数(){
$(“#file_up_form”).ajaxForm({//将库函数绑定到表单
发送前:函数(xhr){
input=document.getElementById('fileToUpload');;
file=input.files[0];
如果(文件){
var reader=new FileReader();
reader.readAsBinaryString(文件);
var shaObj=newjssha(reader.result,“字节”);
var hash=shaObj.getHash(“SHA-512”,“十六进制”);
setRequestHeader('Sha-Sha',散列);
}否则{
警报(“首先,请选择要上载的文件。”);
返回false;
}
},
uploadProgress:函数(事件、位置、总数、完成百分比){},
成功:函数(){},
完成:函数(响应){},
错误:函数(){}
});
});
HTML:
<script type="text/javascript">
$(document).ready(function(){
$("#file_up_form").ajaxForm({ // bind library function to the form
beforeSend: function(xhr){
input = document.getElementById('fileToUpload');;
file = input.files[0];
if(file){
var reader = new FileReader();
reader.readAsBinaryString(file);
var shaObj = new jsSHA(reader.result,"BYTES");
var hash = shaObj.getHash("SHA-512", "HEX");
xhr.setRequestHeader('Sha-Sha', hash);
}else{
alert("First, please select a file to upload.");
return false;
}
},
uploadProgress: function(event, position, total, percentComplete){ },
success: function() { },
complete: function(response) { },
error: function() { }
});
});
</script>
<body>
<form id="file_up_form" action="upload.php" method="post">
<input type="file" id="fileToUpload" name="uploadedfile" />
<!-- Click on submit to perform AJAX call -->
<input type="submit" value="Upload">
</form>
</body>
Thx
但这不起作用,因为javascript是****不同步的,我需要强制与reader.onload()回调进行同步,然后调用ajax。。。ajax请求将被发送,无论是否计算了哈希,如果我在.ajaxForm()
中,它就结束了,甚至setTimeout(function(){…})
本身也是异步的,因此它对发送ajax请求没有任何影响。。。或者如果我把它放在另一个地方,它就会崩溃firefox
我有一个上传按钮来触发请求,正如你提到的,当然,这是我必须首先处理sha-512的计算,然后使用表单绑定触发ajax的唯一触发器
但我不明白的是:
为什么“startUp('ARandomHash');”
在$(“#start_up_按钮”)中工作得非常好
和散列=…;console.log(散列);startUp(散列);“
打印正确的散列,但ajax在读取器.onload()回调中完全失败。。。该事件由同一个单击事件触发,它只有2个执行范围更多
我不认为我失去了提交事件与这2个范围更多,因为文件上传正确。。。只是发送之前的、上载进度:…
等未执行
我想我更愿意尝试转换散列,它可能是一个字符编码问题,否则没有意义,它应该会失败,“启动('ARandomHash');”
但是thx,如果有人有更好的主意=)