我正在使用 javascript 将 XMLHttpRequest 运行到返回数据的 PHP 脚本。基本上我希望能够为用户提供一个进度条(而不是一个旋转的圆圈或其他东西)来显示获取和接收数据的进度。我知道如果我正在获取一个文件,我可以只检查内容长度 header 并使用它,但在脚本的情况下,您不知道它正在检索多少数据。
这个问题的答案可能就像“这不可能”一样简单,因为现在看来确实如此。但总而言之:您如何监控正在运行的脚本 (php) 和 XMLHttpRequest 的进度?
最佳答案
如果您使用的是 FireFox(而且我相当确定除 IE 之外的大多数其他浏览器),那么确实有一种方法可以报告在 XHR 操作期间传输了多少数据。如果有问题的操作发送了正确的 header ,则可以很容易地使用此信息来计算下载数据的百分比。
我在多年前编写了这段代码来确定 XHR 操作中传输的数据百分比,因此我很抱歉它没有反射(reflect)我从那以后获得的多年编码经验。我现在几乎肯定不会这样写!尽管如此,我还是设法把它捞出来了,希望它对你有用。
在撰写本文时,IE7 是可用的最新版本的 Explorer,我记得代码在其中不起作用,因此它包含防止它在 IE 下初始化的代码。我从来没有在版本 8 或版本 9 的测试版下尝试过这段代码,它确实也可以在那些版本中工作,但我不能保证。如果您可以在新版本的 IE 中使用它,请告诉我!
它的工作原理是在 beforeSend 中运行代码(回调 jQuery 为您在开始 ajax 请求之前要运行的代码提供)以设置 Javascript 间隔(在代码中我设置了 50 毫秒,这可能太频繁了. 200 毫秒应该仍然足够,并且对系统的压力较小)。每次触发间隔计时器时,它都会运行一个查看 XHR 请求的 responseText 属性的函数。 responseText 属性保存到目前为止收到的数据的原始文本。通过使用 length() 字符串方法计算其中有多少字符,我们可以计算出到目前为止收集了多少字节。
就计算要发送的总数据的百分比而言,这将要求您的服务器端代码发送一个内容长度 header ,其中包含要发送的字节数的准确计数。这需要您有点小聪明,但应该不会太难。如果您发送准确的内容长度 header ,则它用于计算到目前为止收到的数据的百分比。如果您不设置内容 header ,则会显示到目前为止收到的数据量。
<script type="text/javascript">
$.ajax ({
beforeSend : function (thisXHR)
{
// IE doesn't support responseText access in interactive mode
if (!$.browser.msie)
{
myTrigger = setInterval (function ()
{
if (thisXHR.readyState > 2)
// When there is partial data available use it to determine how much of the document is downloaded
{
var dlBytes = thisXHR.responseText.length;
if (totalBytes == -1)
totalBytes = thisXHR.getResponseHeader ('Content-length');
(totalBytes > 0)?
$('#progress').html (Math.round ((dlBytes / totalBytes) * 100) + "%"):
$('#progress').html (Math.round (dlBytes / 1024) + "K");
}
}, 50); // Check the status every 50 miliseconds
}
},
complete : function ()
{
// Kill the download progress polling timer
if (myTrigger)
clearInterval (myTrigger);
}
});
</script>
关于php - 从 PHP 脚本获取 XMLHttpRequest 进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3990933/
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象