我有自定义网址协议处理程序cgit:[...]
启动后台进程,在本地计算机上配置一些东西。该协议工作正常,我从JavaScript启动它(目前使用document.location = 'cgit:[...]'
),但我实际上希望JavaScript等待相关程序退出。
所以基本上我想要JavaScript做的步骤:
JavaScript做了一些事情
JavaScript启动cgit:[...]
Javascript等待cgit:[...]
退出
JavaScript做了别的事情
代码:
function launchCgit(params)
{
showProgressBar();
document.location="cgit:"+params;
document.addEventListener( /* CGit-Program exited event */, hideProgressBar );
}
或:
function launchCgit(params)
{
showProgressBar();
// setLocationAndWait("cgit:"+params);
hideProgressBar();
}
如果有可能,有什么想法吗?
答案 0 :(得分:1)
由于这不是window.location的预期用途,我怀疑这是一种简单的方法。我的建议是使用AJAX请求并让c ++程序在完成后发送响应。这样,在请求完成后可以运行c ++程序后需要运行的代码。
答案 1 :(得分:1)
由于我没有找到合适的方法来解决使用ajax请求或类似问题的问题,我终于使用包括XmlHttpRequest
要启动协议,我仍然使用document.location=cgit:[...]
我正在使用服务器端系统,包括"锁定文件" - 这就像通用虚拟文件一样,为每个请求生成了名称。
一旦用户请求打开自定义协议,就会在服务器上专门为这一个协议打开请求生成这样的文件。
我创建了一个名为" $ locks"的文件夹。在放置这些文件的服务器上。一旦协议关联程序退出,正在删除相应的文件。
网站使用XmlHttpRequest
不断检查请求的文件是否仍然存在,并且如果没有,则触发回调(例如测试之间的示例:1秒)。
新文件的结构如下:
lockThisRequest.php
:它根据req
url-parameter在$ locks目录中创建一个文件。unlockThisRequest.php
:删除$ locks目录中的文件;再次基于req
url-parameter。它的JavaScript部分:
function launchCgit(params,callback)
{
var lock = /* Generate valid filename from params variable */;
// "Lock" that Request (means: telling the server that a request with this ID is now in use)
var locker = new XmlHttpRequest();
locker.open('GET', 'lockThisRequest.php?req='+lock, true)
locker.send(null);
function retry()
{
// Test if the lock-file still exists on the server
var req = new XmlHttpRequest();
req.open('GET', '$locks/'+lock, true);
req.onReadyStateChanged=function()
{
if (req.readyState == 4)
{
if (req.status == 200)
{
// lock-file exists -> cgit has not exited yet
window.setTimeout(retry,1000);
}
else if (req.status == 404)
{
// lock-file not found -> request has been proceeded
callback();
}
}
}
req.send(null);
}
document.location = 'cgit:'+params; // execute custom protocol
retry(); // initialize lockfileCheck-loop
}
Ussage是:
launchCgit("doThisAndThat",function()
{
alert("ThisAndThat finished.");
});
lockThisRequest.php
- 文件:
<?php
file_put_contents("$locks/".$_GET["req"],""); // Create lock file
?>
和unlockThisRequest.php
:
<?php
unlink("../\$locks/".$_GET["req"]); // Delete lock file
?>
协议执行的本地程序/脚本可以简单地调用类似:
#!/bin/bash
curl "http://servername/unlockThisRequest.php?req=$1"
完成后。
正如我刚才说的那样有效,但除了好的之外还有别的(祝贺你跟踪这些说明)
我更倾向于使用更简单的方式而(重要)这也可能会导致lockThisRequest.php
和unlockThisRequest.php
文件出现安全问题!
我对这个解决方案很好,因为我只在受密码保护的私人网页上使用它。但是,如果您打算在公共或非受保护页面上使用它,您可能需要为php文件添加一些安全性。
无论如何,该解决方案现在适用于我,但如果有人找到更好的方法 - 例如通过使用ajax请求 - 他/她将非常欢迎将这种方式添加到相应的stackoverflow文档或类似的并在此主题上发布一个链接。我仍然对替代解决方案感兴趣:)