0

我正在尝试从 C++ 代码中调用一些 jQuery 函数。我所做的是将整个 jQuery 库复制为一个字符串,并使用 jsc_context_evaluate() 来访问所有 jQuery 方法。

这是一个带有字符串的非特定精简版本,它工作正常:

JSCValue* jsVar = jsc_context_evaluate(jsCtx, "$('some-div')");
jsc_value_object_invoke_method(jsVar, "html", G_TYPE_STRING, "foo", G_TYPE_NONE);

这会将“some-div”的内容更改为“foo”。(我知道 'some-div' 应该有一个 '.' 或 '#' 但它只是为了表示)

当我尝试使用一个对象时,该功能不起作用。

JSCValue* jsVar = jsc_context_evaluate(jsCtx, "$('some-div')");
JSCValue* jsDiv = jsc_context_evaluate(jsCtx, "$('some-other-div')");
jsc_value_object_invoke_method(jsVar, "html", G_TYPE_OBJECT, jsDiv, G_TYPE_NONE);

而不是 'some-div' 得到 'some-other-div' 的内容,什么都没有发生。当我将返回值打印...invoke_method()为字符串时,jsc_value_to_string()我得到未定义。我用其他 jQuery 方法尝试过,add但结果相同,函数返回 undefined 并且没有任何变化。

4

1 回答 1

0

我要做的第一件事是检查函数调用是否没有发出异常。显然jsc_context_evaluate正在工作,所以我只检查最后一个函数调用:

JSCValue* jsVar = jsc_context_evaluate(jsCtx, "$('some-div')");
JSCValue* jsDiv = jsc_context_evaluate(jsCtx, "$('some-other-div')");
jsc_value_object_invoke_method(jsVar, "html", G_TYPE_OBJECT, jsDiv, G_TYPE_NONE);
JSCException* exception = jsc_context_get_exception(jsCtx);
if (exception != NULL) {
  g_print("%s: %s\n", jsc_exception_get_name(exception),
                      jsc_exception_get_message(exception));
  free(exception);
  return;
}

这可能会让你知道发生了什么。

我的怀疑是问题在于您将对象传递给 jQuery 的 function html。根据 jQuery 的文档(https://www.geeksforgeeks.org/jquery-html-method/),该html函数可以接收 3 种类型的参数:

  • null,返回节点的内容。
  • 内容(字符串),设置节点的内容。
  • function,使用函数来设置节点的内容。

jsDiv是一个对象。我认为您需要传递其内容,如下所示:

JSCValue* jsVar = jsc_context_evaluate(jsCtx, "$('some-div')");
JSCValue* jsDiv = jsc_context_evaluate(jsCtx, "$('some-other-div')");
JSCValue* content = jsc_value_object_invoke_method(jsDiv, "html", G_TYPE_NONE);
char* contentString = jsc_value_to_string(jsCtx, content);
jsc_value_object_invoke_method(jsVar, "html", G_TYPE_OBJECT, contentString, G_TYPE_NONE);
于 2019-12-23T10:26:26.660 回答