【问题标题】:Can I execute a Javascript function inside Spidermonkey and get the return value?我可以在 Spidermonkey 中执行 Javascript 函数并获取返回值吗?
【发布时间】:2012-09-14 11:27:24
【问题描述】:

我刚刚开始使用 Delphi 和 Spidermonkey。以前我会将网页加载到 TWebBrowser 组件中,并与加载的网页中的 Javascript 代码进行交互。这很麻烦,因为要将值返回给 delphi,我必须通过 Javascript 代码将它们加载到 DOM 对象中,然后从 Delphi 检查 DOM 以找到该对象并访问它的 value 属性。

使用 Spidermonkey,我可以执行特定的 Javascript 函数并轻松地直接将返回值返回到 Delphi 中吗?如果是这样,请向我指出一个有用的快速代码示例。 Spidermonkey 附带的 3 个样本似乎没有涉及到这一点。

【问题讨论】:

  • 不知道如何在 Delphi 中使用(我发现只有相当过时的 bridge project 并且没有亲自尝试过)但是您正在寻找 JS_CallFunctionName 函数,可以使用 @987654323 @.
  • @TLama - 再次感谢您找到 javascript 桥接项目。我仍然无法弄清楚如何直接获取返回值,因为在使用引擎对象和调用 JS_CallFunctionName() 的代码之间存在一层桥接类对象。 JS_CallFunctionName() 由主引擎对象在内部出于其他目的调用,但以一种简单的方式执行此操作以简单地执行一个 Javascript 函数并从中获取返回值我还不清楚。现在我正在创建一个隐藏的 TLabel 组件并使用它将值从 Javascript 传输回 Delphi。

标签: javascript delphi spidermonkey


【解决方案1】:

> 使用 Spidermonkey,我可以执行特定的 Javascript 函数并轻松地直接将返回值返回到 Delphi 中吗?

是的,有可能。与 Delphi XE2/XE4 兼容的示例。

var
    recFunction,
    recReturnValue,
    recJSVar        : jsval;

........

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//-=- Find entry point to function.
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

if JS_LookupProperty (TSMJSEngine.Context, TSMJSEngine.Global.JSObject, PAnsiChar (AnsiString (strFunctionToRun)), @recFunction) <> js_true then
begin
    //-=- Everything very bad :)
end;

if recFunction.asPtr = nil then
begin
    //-=- Everything very bad :)
end;

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//-=- Call function 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

if JS_CallFunctionValue (TSMJSEngine.Context, TSMJSEngine.Global.JSObject, recFunction, 0, nil, @recReturnValue) = Integer (false) then
begin
    //-=- Everything very bad :)
end;

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//-=- Get returning result (type: string).
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

strResult := JSValToString (TSMJSEngine.Context, recReturnValue);

【讨论】:

    【解决方案2】:

    我对 delphi 一无所知,但听起来您会想要设置某种类型的 api 或路由以在前端/后端系统之间进行传输。

    【讨论】:

      猜你喜欢
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 2012-05-18
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多