Asm.js C+中的整个web应用程序+;使用DOM交互 我最近听说过用EnScript编写C++代码到JavaScript,如果ASMJS优化完成,它就有可能快速运行应用程序。

Asm.js C+中的整个web应用程序+;使用DOM交互 我最近听说过用EnScript编写C++代码到JavaScript,如果ASMJS优化完成,它就有可能快速运行应用程序。,asm.js,Asm.js,我读过好几篇文章、教程,甚至听过一些非常有趣的文章。我还成功地运行了hello world示例 但是,我不知道这种方法的全部能力,特别是如果一个完整的新 WebApp可以/应该用C++编写为一个整体,没有胶粘代码。 更具体地说,我想写类似于下面的C++(作为引用而不是工作代码)的东西。 #包括 类ApplicationLogic:public DOMListener{ 私人: int-num; 公众: ApplicationLogic():num(0); 虚拟void onclick事件(DOM

我读过好几篇文章、教程,甚至听过一些非常有趣的文章。我还成功地运行了hello world示例

但是,我不知道这种方法的全部能力,特别是如果一个完整的<强>新<强> WebApp可以/应该用C++编写为一个整体,没有胶粘代码。 更具体地说,我想写类似于下面的C++(作为引用而不是工作代码)的东西。

#包括
类ApplicationLogic:public DOMListener{
私人:
int-num;
公众:
ApplicationLogic():num(0);
虚拟void onclick事件(DOMEventData事件){
num++;
}
虚拟~ApplicationLogic(){}
}
int main(){
domeElement but=Window.getElementById(“foo”);
ApplicationLogic应用程序();
但是.setOnclick(app);
}
我希望它能明确这个想法,但目标是实现类似于:

  • 一个静态函数,在窗口准备就绪时初始化模块运行(与jquery.ready()的行为相同)。因此,可以将侦听器添加到DOM元素中

  • 直接从C/C++与DOM交互的一种方法,因此
    #包括
    ,基本上可以访问DOM和其他元素,如JSON、Navigator等

我一直在想Lua,以及当Lua脚本包含一个共享对象(动态链接库)时,它如何在该.so文件中搜索一个初始化函数,在那里可以注册模块外部可用的函数,这正是在asmjs中创建的函数模块的返回操作。但是我无法理解如何用C++直接模拟JQueRe.

正如您所见,我对ASMJS了解甚少,但我没有找到教程或类似的内容,我已经阅读了对STDLBC、STDLBC++和SDL编译时所包含的标准库的引用,但没有引用如何从C++源操作DOM。如果您开始使用专门用于web的新代码库,那么duetto可能是一个解决方案。但在我看来,duetto有很多缺点,比如没有C分配器,这可能会使您很难使用第三方库

如果您使用的是emscripten,那么它为所有类型的DOM事件提供了一个API,这几乎完全符合您的需要

emscripten_set_click_callback(const char *target, void *userData, int useCapture, int (*func)(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData));

希望这能帮上忙。我知道这是一个老话题,但我在这里发帖,以防其他人来这里寻找这个问题的答案(就像我一样)

从技术上讲,是的,这是可能的——但是有大量你称之为“胶水代码”的东西,还有大量的JavaScript(这与IMO的目的背道而驰)。例如:

#include <emscripten.h>
#include <string>

#define DIV 0
#define SPAN 1
#define INPUT 2
// etc. etc. etc. for every element you want to use

// Creates an element of the given type (see #defines above)
// and returns the element's ID
int RegisterElement(int type)
{
    return EM_ASM_INT({
        var i = 0;
        while (document.getElementById(i))
            i++;
        var t;
        if ($0 == 0) t = "div";
        else if ($0 == 1) t = "span";
        else if ($0 == 2) t = "input";
        else
            t = "span";
        var test = document.createElement(t);
        test.id = i;
        document.body.appendChild(test);
        return i;
    }, type);
}

// Calls document.getElementById(ID).innerHTML = text
void SetText(int ID, const char * text)
{
    char str[500];
    strcpy(str, "document.getElementById('");
    char id[1];
    sprintf(id, "%d", ID);
    strcat(str, id);
    strcat(str, "').innerHTML = '");
    strcat(str, text);
    strcat(str, "';");
    emscripten_run_script(str);
}

// And finally we get to our main entry point...
int main()
{
    RegisterElement(DIV);    // Creates an empty div, just as an example
    int test = RegisterElement(SPAN);    Creates an empty SPAN, test = its ID
    SetText(test, "Testing, 1-2-3");    Set the span's inner HTML
    return 0;    And we're done
}
#包括
#包括
#定义div0
#定义跨度1
#定义输入2
//等等,你想用的每一个元素
//创建给定类型的元素(请参见上面的#定义)
//并返回元素的ID
int注册表项(int类型)
{
返回EM\u ASM\u INT({
var i=0;
while(document.getElementById(i))
i++;
变量t;
如果($0==0)t=“div”;
如果($0==1)t=“span”;
如果($0==2)t=“输入”;
其他的
t=“span”;
var测试=document.createElement(t);
test.id=i;
文件.正文.附件(试验);
返回i;
},类型);
}
//调用document.getElementById(ID).innerHTML=text
void SetText(int-ID,const-char*text)
{
char-str[500];
strcpy(str,“document.getElementById(');
字符id[1];
sprintf(id,“%d”,id);
strcat(str,id);
strcat(str,“).innerHTML=”);
strcat(str,text);
strcat(str,“;”);
emscripten_run_script(str);
}
//最后我们到达了我们的主要入口点。。。
int main()
{
RegisterElement(DIV);//创建一个空DIV,如下所示
int test=RegisterElement(SPAN);创建一个空SPAN,test=ID
SetText(test,“Testing,1-2-3”);设置跨度的内部HTML
返回0;我们就完成了
}

我有同样的问题,并提出了这个解决方案,它编译和工作的预期。但我们基本上是在构建一个C/C++API,以实现JavaScript已经“开箱即用”的功能。不要误会我的观点,从语言的角度来看,我每天都会用C++来取代JavaScript——但我不禁觉得它不值得开发这样的设置中的开发时间和可能的性能问题。如果我要在C++中做一个Web应用程序,我肯定会使用CHIERP(Duto的新名称)。

Duto是为这个用法而设计的:@工业抗抑郁药,如果你把你的评论作为答案,我会接受它。@工业抗抑郁药是专有的。我不确定你所说的“无C分配器”是什么意思。我认为您可能指的是这样一个事实:当使用Duetto时,您不能使用操作内存的自定义分配器,这是一种类型不安全的方式。在这种情况下,我相信大多数使用自定义分配器的第三方库可以配置为使用标准分配器(即普通malloc/free)。我还想知道你提到的其他缺点。充分披露:我是Duetto的工作人员之一。
#include <emscripten.h>
#include <string>

#define DIV 0
#define SPAN 1
#define INPUT 2
// etc. etc. etc. for every element you want to use

// Creates an element of the given type (see #defines above)
// and returns the element's ID
int RegisterElement(int type)
{
    return EM_ASM_INT({
        var i = 0;
        while (document.getElementById(i))
            i++;
        var t;
        if ($0 == 0) t = "div";
        else if ($0 == 1) t = "span";
        else if ($0 == 2) t = "input";
        else
            t = "span";
        var test = document.createElement(t);
        test.id = i;
        document.body.appendChild(test);
        return i;
    }, type);
}

// Calls document.getElementById(ID).innerHTML = text
void SetText(int ID, const char * text)
{
    char str[500];
    strcpy(str, "document.getElementById('");
    char id[1];
    sprintf(id, "%d", ID);
    strcat(str, id);
    strcat(str, "').innerHTML = '");
    strcat(str, text);
    strcat(str, "';");
    emscripten_run_script(str);
}

// And finally we get to our main entry point...
int main()
{
    RegisterElement(DIV);    // Creates an empty div, just as an example
    int test = RegisterElement(SPAN);    Creates an empty SPAN, test = its ID
    SetText(test, "Testing, 1-2-3");    Set the span's inner HTML
    return 0;    And we're done
}