Могу ли я выполнить функцию Javascript внутри Spidermonkey и получить возвращаемое значение?

Я только начинаю использовать Delphi с Spidermonkey. Раньше я загружал веб-страницу в компонент TWebBrowser и взаимодействовал с кодом Javascript на загруженной веб-странице. Это было запутанно, потому что для возврата значений обратно в delphi мне приходилось загружать их в объект DOM с помощью кода Javascript, а затем проверять DOM из Delphi, чтобы найти этот объект и получить доступ к его свойству value.

Могу ли я с помощью Spidermonkey выполнить определенную функцию Javascript и легко получить возвращаемое значение обратно в Delphi? Если это так, пожалуйста, укажите мне быстрый пример кода, который был бы полезен. 3 образца, поставляемые с Spidermonkey, похоже, не имеют к этому отношения.


person Robert Oschler    schedule 22.09.2012    source источник
comment
Не знаю как в Delphi (нашел только довольно устаревший bridge project и лично не пробовал ), но вы ищете функцию JS_CallFunctionName, которая можно использовать this way.   -  person TLama    schedule 22.09.2012
comment
@TLama - еще раз спасибо за то, что нашли проект моста javascript. Я до сих пор не могу понять, как получить возвращаемое значение напрямую, поскольку между кодом, использующим объект движка, и вызовом JS_CallFunctionName() существует слой объектов класса моста. JS_CallFunctionName() вызывается внутри объекта основного движка для других целей, но сделать это простым способом, чтобы просто выполнить одну функцию Javascript и получить от нее возвращаемое значение, мне пока не ясно. Сейчас я создаю скрытый компонент TLabel и использую его для передачи значения из Javascript обратно в Delphi.   -  person Robert Oschler    schedule 23.09.2012


Ответы (2)


> Могу ли я с помощью 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);
person Zam    schedule 17.12.2013

Я ничего не знаю о Delphi, но похоже, что вы захотите настроить какой-то тип API или маршруты для передачи между интерфейсной/бэкэнд-системой.

person Rummy    schedule 22.05.2013