页面加载时,jQuery AJAX 在 Chrome/Chromium 中不会触发
场景:我有一个上传表单,它使用 nginx uploadProgress 模块报告上传进度。下面的代码在 Firefox 中运行良好,但在 Chrome 和 Chromium 中,AJAX 在页面加载时不会触发,只有在我停止请求时才会运行(因此上传到一半时)。我不知道为什么它不起作用。因此,非常感谢任何帮助。
我还发现奇怪的是 Chrome/Chromium 似乎在没有我告诉它的情况下用上传进度更新了窗口状态栏。
我无法看到我在哪里进行设置。 Chrome 有可能有内部进度表吗?
upload.js
$(document).ready(function()
{
$('form').uploadProgress(
{
uploading: function(upload)
{
$('#percents').html(upload.percents+'%');
$('#progressbar').css({width: upload.percents+'%'});
},
progressUrl: "/progress",
interval: 3
});
})
jquery.uploadProgress.js
/*
* jquery.uploadProgress
*
* Copyright (c) 2008 Piotr Sarnacki (drogomir.com)
* - Original release.
*
* Copyright (c) 2011 Mathew Davies ([email protected])
* - Refactored a lot of code into their own functions
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/mit-license.php
*
*/
(function($)
{
/**
* Generate a UUID used to uniquely identify form uploads.
*
* @return string
*/
function generate_uuid()
{
var uuid = "";
for (i = 0; i < 32; i++)
{
uuid += Math.floor(Math.random() * 16).toString(16);
}
return uuid;
}
/**
* Calls the progress URL to get the latest statistics from
* the uploaded form.
*
* @return void
*/
function update(object, options)
{
$.ajax(
{
type: 'GET',
cache: false,
dataType: options.dataType,
url: options.progressUrl,
beforeSend: function(xhr)
{
xhr.setRequestHeader("X-Progress-ID", options.uuid);
},
success: function(upload)
{
alert('progress ...');
if (upload)
{
if (upload.state == 'uploading')
{
upload.percents = Math.floor((upload.received / upload.size) * 1024) / 10;
options.uploading(upload);
}
if (upload.state == 'done' || upload.state == 'error')
{
window.clearTimeout(options.timer);
}
if (upload.state == 'done')
{
upload.percents = 100;
options.done(upload);
}
if (upload.state == 'error')
{
upload.percents = 0;
options.error(upload);
}
}
}
});
}
/**
* Updates the form action to use the UUID.
*/
function update_form_action(form, uuid)
{
if(old_id = /X-Progress-ID=([^&]+)/.exec(form.attr("action")))
{
var action = form.attr("action").replace(old_id[1], uuid);
}
else
{
var action = form.attr("action") + "?X-Progress-ID=" + uuid;
}
form.attr("action", action);
}
$.fn.uploadProgress = function(options)
{
var options = $.extend(
{
dataType: "json",
interval: 2000,
progressUrl: "/progress",
start: function() {},
uploading: function() {},
done: function() {},
error: function() {},
timer: ""
}, options);
return this.each(function()
{
$(this).submit(function()
{
var $this = $(this);
// Generate a new UUID
options.uuid = generate_uuid();
// Update form action with ID
update_form_action($this, options.uuid);
// Start callback
options.start();
// Start process
options.timer = window.setInterval(function()
{
update($this, options)
},
options.interval * 1000);
});
});
};
})(jQuery);
Scenario: What I have is an upload form that reports on the upload progress using the nginx uploadProgress module. The code below works fine in Firefox, but with Chrome and Chromium the AJAX is not fired while the page is loading and will only be run when I stop the request (so half way through the upload). I'm lost as to why it doesn't work. So any help is much appreciated.
What I also find bizarre is that Chrome/Chromium seem to update the window status bar with the upload progress without me telling it to.
There's no where I can see where I'm setting that. Is it possible that Chrome has an internal progress meter?
upload.js
$(document).ready(function()
{
$('form').uploadProgress(
{
uploading: function(upload)
{
$('#percents').html(upload.percents+'%');
$('#progressbar').css({width: upload.percents+'%'});
},
progressUrl: "/progress",
interval: 3
});
})
jquery.uploadProgress.js
/*
* jquery.uploadProgress
*
* Copyright (c) 2008 Piotr Sarnacki (drogomir.com)
* - Original release.
*
* Copyright (c) 2011 Mathew Davies ([email protected])
* - Refactored a lot of code into their own functions
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/mit-license.php
*
*/
(function($)
{
/**
* Generate a UUID used to uniquely identify form uploads.
*
* @return string
*/
function generate_uuid()
{
var uuid = "";
for (i = 0; i < 32; i++)
{
uuid += Math.floor(Math.random() * 16).toString(16);
}
return uuid;
}
/**
* Calls the progress URL to get the latest statistics from
* the uploaded form.
*
* @return void
*/
function update(object, options)
{
$.ajax(
{
type: 'GET',
cache: false,
dataType: options.dataType,
url: options.progressUrl,
beforeSend: function(xhr)
{
xhr.setRequestHeader("X-Progress-ID", options.uuid);
},
success: function(upload)
{
alert('progress ...');
if (upload)
{
if (upload.state == 'uploading')
{
upload.percents = Math.floor((upload.received / upload.size) * 1024) / 10;
options.uploading(upload);
}
if (upload.state == 'done' || upload.state == 'error')
{
window.clearTimeout(options.timer);
}
if (upload.state == 'done')
{
upload.percents = 100;
options.done(upload);
}
if (upload.state == 'error')
{
upload.percents = 0;
options.error(upload);
}
}
}
});
}
/**
* Updates the form action to use the UUID.
*/
function update_form_action(form, uuid)
{
if(old_id = /X-Progress-ID=([^&]+)/.exec(form.attr("action")))
{
var action = form.attr("action").replace(old_id[1], uuid);
}
else
{
var action = form.attr("action") + "?X-Progress-ID=" + uuid;
}
form.attr("action", action);
}
$.fn.uploadProgress = function(options)
{
var options = $.extend(
{
dataType: "json",
interval: 2000,
progressUrl: "/progress",
start: function() {},
uploading: function() {},
done: function() {},
error: function() {},
timer: ""
}, options);
return this.each(function()
{
$(this).submit(function()
{
var $this = $(this);
// Generate a new UUID
options.uuid = generate_uuid();
// Update form action with ID
update_form_action($this, options.uuid);
// Start callback
options.start();
// Start process
options.timer = window.setInterval(function()
{
update($this, options)
},
options.interval * 1000);
});
});
};
})(jQuery);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Webkit 中似乎报告了一个问题,即 XmlHttpRequest 在文件上传/表单发布期间无法按预期工作。
Chrome 错误报告,包含指向 webkit 的链接:http://code.google .com/p/chromium/issues/detail?id=45196
Seems like there is a reported issue within Webkit where XmlHttpRequest does not work as expected during file uploads / form posts.
Chrome bug report w/ links to webkit here: http://code.google.com/p/chromium/issues/detail?id=45196