Цельное веб-приложение на С++ с взаимодействием DOM - программирование
Подтвердить что ты не робот

Цельное веб-приложение на С++ с взаимодействием DOM

Недавно я слышал о компиляции кода на С++ в javascript с использованием emscripten и о том, как это сделать, если оптимизация asmjs выполняется, он может быстро запускать приложения.

Я прочитал несколько сообщений, учебник и даже услышал очень интересные видео youtube. Я также успешно выполнил пример hello world.

Однако я не знаю полных возможностей этого подхода, особенно если весь новый webapp может/должен быть написан на С++ в целом без кода клея.

Более конкретно я хотел бы написать что-то похожее на следующий С++ (в качестве ссылочного нерабочего кода).

#include <window>
class ApplicationLogic : public DOMListener{
private:
    int num;
public:
    ApplicationLogic():num(0);
    virtual void onClickEvent(DOMEventData event){
        num++;
    }
    virtual ~ApplicationLogic(){}
}

int main(){
    DOMElement but = Window.getElementById("foo");
    ApplicationLogic app();
    but.setOnclick(app);
}

Надеюсь, это ясно изложит эту идею, но целью является достижение чего-то похожего на:

  • Статическая функция, которая инициализирует модуль, запускается, когда окно готово (такое же поведение, которое дает jquery.ready()). Поэтому слушатели могут быть добавлены в элементы DOM.

  • Способ взаимодействия с DOM непосредственно из C/С++, следовательно #include <window>, в основном доступ к DOM и другим элементам, таким как JSON, Navigator и т.д.

Я продолжаю думать о Lua, и как, когда lua script включает общий объект (динамическая связанная библиотека), он искал функцию инициализации в этом .so файле, и там можно было зарегистрировать функции, доступные извне модуля, точно так же действует возврат функционального модуля, созданного в asmjs. Но я не могу понять, как эмулировать jquery.ready непосредственно с С++.

Как вы можете видеть, у меня мало знаний об asmjs, но я не нашел учебников или подобных для того, что я ищу, я прочитал ссылки на стандартные библиотеки, включенные во время компиляции для stdlibc, stdlibС++ и SDL, но нет ссылки на то, как манипулировать DOM из источника С++.

4b9b3361

Ответ 1

что. Я знаю, что это старая тема, но я отправляю ее здесь, если кто-то еще сюда придет, ища ответ на этот вопрос (как и я).

Технически, да, это возможно - но с тонной частью того, что вы назвали "кодом клея", а также с хорошей долей 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 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 inner HTML
    return 0;    And we're done
}

У меня был такой же вопрос, и я придумал это решение, и он скомпилировался и работал, как ожидалось. Но мы в основном создаем C/С++ API, чтобы сделать то, что JavaScript уже делает "из коробки". Не поймите меня неправильно - с точки зрения языка я бы принимал С++ над JavaScript в любой день, но я не могу не думать, что это не стоит времени разработки и возможных проблем с производительностью, связанных с настройкой, подобной этой. Если бы я собирался сделать веб-приложение на С++, я бы определенно использовал Cheerp (новое имя для Duetto).

Ответ 2

Как уже указывал кто-то, если вы начинаете с новой кодовой базы исключительно для Интернета, то duetto может быть решением. Но, на мой взгляд, у duetto есть много недостатков, например, нет компиляторов C, которые, вероятно, сделают это очень трудным, если вы захотите использовать сторонние библиотеки.

Если вы используете emscripten, он предоставляет API для всех видов событий DOM, что делает практически то, что вы хотите.

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

надеюсь, что это поможет