在客户端运行的 JavaScript 代码不能同时访问服务器的文件系统,更不用说写文件了。人们常说,如果 JS 有 IO 能力,那将是相当不安全的……想象一下那有多危险会有多危险。
您可以做的只是构建您的字符串,使用一个Worker
在关闭时返回完整的数据字符串,然后将其发送到服务器(AJAX 调用)。
服务器端脚本(Perl、PHP、.NET、Ruby...)可以接收这些数据,对其进行解析,然后根据需要将文件写入磁盘。
总而言之,不是很难,但无论如何都是一个非常有趣的项目。哦,当使用工作人员时,将其视为在线游戏和所有内容,也许setInterval
每次发送(部分)数据5000ms
也可能不是一个坏主意。
根据要求 - 一些基本的代码片段。
一个简单的 AJAX 设置函数:
function getAjax(url,method, callback)
{
var ret;
method = method || 'POST';
url = url || 'default.php';
callback = callback || success;//assuming you have a default function called "success"
try
{
ret = new XMLHttpRequest();
}
catch (error)
{
try
{
ret= new ActiveXObject('Msxml2.XMLHTTP');
}
catch(error)
{
try
{
ret= new ActiveXObject('Microsoft.XMLHTTP');
}
catch(error)
{
throw new Error('no Ajax support?');
}
}
}
ret.open(method, url, true);
ret.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
ret.setRequestHeader('Content-type', 'application/x-www-form-urlencode');
ret.onreadystatechange = callback;
return ret;
}
var getRequest = getAjax('script.php?some=Get¶ms=inURL', 'GET');
getRequest.send(null);
var postRequest = getAjax('script.php', 'POST', function()
{//passing anonymous function here, but this could just as well have been a named function reference, obviously...
if (this.readyState === 4 && this.status === 200)
{
console.log('Post request complete, answer was: ' + this.response);
}
});
postRequest.send('foo=bar');//set different headers to pos JSON.stringified data
这里是阅读上面代码中没有得到的任何内容的好地方。这几乎是一段复制粘贴代码,但如果您发现自己想了解更多,这里是一个很好的地方。
WebWorkers
现在这些都是相当新的,所以使用它们确实意味着不能支持旧浏览器(您可以通过使用事件侦听器将每一点数据发送到服务器来支持它们,但是工作者允许您捆绑、预处理并在不阻塞脚本的“正常”流程的情况下构建数据。工作者通常作为排序多线程 JavaScript 代码的一种手段。这是对它们的一个很好的介绍
基本上,你需要添加这样的东西到你的脚本:
var worker = new Worker('preprocess.js');//or whatever you've called the worker
worker.addEventListener('message', function(e)
{
var xhr = getAjax('script.php', 'post');//using default callback
xhr.send('data=' + e.data);
//worker.postMessage(null);//clear state
}, false);
那么,您的工人可以这样开始:
var time, txt = '';
//entry point:
onmessage = function(e)
{
if (e.data === null)
{
clearInterval(time);
txt = '';
return;
}
if (txt === '' && !time)
{
time = setInterval(function()
{
postMessage(txt);
}, 5000);//set postMessage to be called every 5 seconds
}
txt += e.data;//add new text to current string...
}
服务器端,事情再简单不过了:
if ($_POST && $_POST['data'])
{
$file = $_SESSION['filename'] ? $_SESSION['filename'] : 'File'.session_id();
$fh = fopen($file, 'a+');
fwrite($fh, $_POST['data']);
fclose($fh);
}
echo 'ok';
现在所有这些代码都有些粗糙,而且大多数代码不能以其当前形式使用,但它应该足以让您入门。如果你不知道什么是,谷歌它。
但是请记住,对于 JS,MDN无疑是最好的参考,就 PHP 而言,他们自己的网站(php.net/{functionName}) 非常丑陋,但确实包含很多信息的也...