在JavaScript客户端中写入文本文件,无需用户输入



一点背景。我在嵌入式IE浏览器中运行了一个映射程序。IE暴露了IHTMLDocument2 = interface(IHTMLDocument),我用它来调用外部(桌面)方法。工作很好,但谷歌将很快停止支持IE, Edge不支持外部呼叫。

interface IMyExternal: IDispatch
{
[id(0x000000C9)]
HRESULT _stdcall ShowQtrMinBounds([in] BSTR QtrNorth, [in] BSTR QtrSouth, [in] BSTR QtrEast, [in] BSTR QtrWest);
[id(0x000000CA)]
HRESULT _stdcall ShowMarker([in] BSTR MsgStream, [in] BSTR ticketID);
[id(0x000000CD)]
HRESULT _stdcall ManageQtrGrid([in] BSTR functionName, [in] BSTR retState);
[id(0x000000CE)]
HRESULT _stdcall SaveQtrMinutes([in] BSTR qtrMinuteCode);
[id(0x000000CF)]
HRESULT _stdcall WhoIsHere([in] BSTR qtrMinuteCode);
};

为了解决这个问题,我决定写入一个文件。我旋转一个线程寻找textFile,应该被命名为相同的方法。文件内容将作为参数。

我的问题是,我不是一个复杂的JS开发人员。我已经搜索了可用的脚本,让我开始。我发现:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr><td>Text to Save:</td></tr>
<tr>
<td colspan="3">
<textarea id="inputTextToSave" cols="20" rows="5"></textarea>
</td>
</tr>
<tr>
<td>Filename to Save As:</td>
<td><input id="inputFileNameToSaveAs"></input></td>
<td><button onclick="saveTextAsFile()">Save Text to File</button></td>
</tr>
</table>
<script type="text/javascript">
function saveTextAsFile()
{
var textToWrite = document.getElementById("inputTextToSave").value;
var textFileAsBlob = new Blob([textToWrite], {type:'text/plain'});
var fileNameToSaveAs = document.getElementById("inputFileNameToSaveAs").value;
var downloadLink = document.createElement("a");
downloadLink.download = fileNameToSaveAs;
downloadLink.innerHTML = "Download File";
if (window.webkitURL != null)
{
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
}
downloadLink.click();
}
</script>
</body>
</html>

以上在原则上是可行的,但我不能在实践中使用。我不能使用用户输入。这是一个典型的电话。

function whoBeHere(point) {
var LeftLat = (Math.floor(point.lat() / llOffset) * llOffset);
var LeftLng = (Math.floor(point.lng() / llOffset) * llOffset);
var qtrMinute = ddToQM(LeftLat, LeftLng);
external.WhoIsHere(qtrMinute);  
}

我需要我的脚本写入一个文件,在上面的情况下,它将被命名为"WhoIsHere"其内容为"qtrMinute = 34.0, 82.44">

我已经看过Node.JS,但这必须发生在客户端。

更多信息。我的程序在谷歌地图上创建了一个网格,我称之为"四分之一分钟"。我的用户在一个我称为fencing的过程中使用鼠标选择qtr分钟。

function SaveQtrMin() {
for (var m in qtrArray) {
external.SaveQtrMinutes(qtrArray[m].qtrMinute);
}
}

写现在我调用一个COM对象,我已经从IE的Winapi.ActiveX实例化。它公开了允许我向桌面写入内容的方法。SaveQtrMinutes(qtrArray[m]. qtrminute)是我10年前用Delphi编写的一个COM对象。谷歌正在限制从IE访问谷歌地图,所以我的COM对象将停止工作。

因此,为了使其工作,我决定不调用Edge不支持的Delphi方法,而是直接写入到file。

我可以通过旋转一个在文件夹中查找文件的线程来监视文件何时被写入。如果找到一个,它将运行文件中写入的过程。

假设你在谷歌地图上点击了餐馆。我希望浏览器将餐厅名称写入一个文件。我将让一个进程持续地在文件夹中查找,如果是一个文件,它将打开它并以某种方式响应它。


谢谢

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr><td>Text to Save:</td></tr>
<td><button onclick="saveTextAsFile()">Save Text to File</button></td>
</tr>
</table>
<script type="text/javascript">
function saveTextAsFile()
{
var textToWrite = 'Param1, param2';
var textFileAsBlob = new Blob([textToWrite], {type:'text/plain'});
var fileNameToSaveAs =  'FileNameNow.txt';
var downloadLink = document.createElement("a");
downloadLink.download = fileNameToSaveAs;
downloadLink.innerHTML = "Download File";
if (window.webkitURL != null)
{
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
}
downloadLink.click();
}
</script>
</body>
</html>

最新更新