我想从C ++代码调用Javascript函数。
以下是我的Javascript代码(hello.html)
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
function myFunction() {
alert("hello");
}
document.getElementById("demo").innerHTML = myFunction();
</script>
</body>
</html>
说我有C ++代码如下
#include<iostream>
using namespace std;
int main()
{
// Calling the Javascript function [ myFunction() ] here
}
我有一台运行Ubuntu 10.04的网关设备,我无法在设备上安装任何新软件。
我尝试使用nodejs和emscriptem从C ++调用javascript函数。使用nodejs和emscriptem 方法我需要在网关设备上进行apt-get更新,安装SDK等,这是不允许的。
除了nodejs和emscriptem之外,还有其他方法可以从C ++调用javascript函数吗?
答案 0 :(得分:0)
考虑到你的局限性,你可以在C ++中编写一个相当复杂的服务器软件,其中包含一个伴随的JavaScript,它将在开放的浏览器窗口中运行并轮询服务器上的套接字(即你的C ++程序)。
或者,一种非常简单但相当丑陋的方法是通过C ++中的system
函数调用浏览器,在执行时运行脚本,例如
#include <stdlib.h>
int main(int argc, char argv[])
{
// Code to retrieve database results
// Code to generate HTML/JavaScript file - if relevant - saving to /path/script.html
// Run the browser with your script loaded
system("firefox -browser -url /path/script.html");
return 0;
}
答案 1 :(得分:0)
我有办法在同一台机器上与一个页面通信C ++代码。 没有系统调用,没有外部库。只是标准的javascript和C ++。诀窍是C ++代码生成一个调用该函数的js,然后页面定期加载js来运行该函数。
C ++代码
#include <fstream>
#include <cstdlib>
#include <unistd.h>
using namespace std;
int call_id = 0;
//the function that commit an update
void callFunction() {
// the file to write the response
ofstream fout("response.js");
//this file just call javascript function with a correlative
//see the page for the definition of caller function
fout << "caller(" << call_id++ << ", myFunction);";
}
int main(int argc, char** argv) {
//a dummy loop to generate different updates
while ( true ) {
sleep(2);
if ( std::rand()%2 )
callFunction();
};
}
页面
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<script type="application/javascript">
//this code is needed to prevent repeated calls. It checks a correlative to each function call to not repeat it
var call_id = 0;
function caller(i, func) {
if ( call_id < i ) {
call_id = i;
func();
}
}
//your function
function myFunction() {
alert("my Function called");
}
//this code load an js script and prevents infinite spamming of script elements
function loadScript(file) {
var id = "some_script_id";
var e = document.getElementById(id);
if ( e != null )
e.parentNode.removeChild(e);
var script = document.createElement("script");
script.id = id;
script.src = file;
document.body.appendChild(script);
}
//to update
window.setInterval(function(){
//replace with the path where the c++ code write the response
loadScript("file:///path/to/response.js");
}, 1000);
</script>
</body>
</html>