Revision Difference
DHTML:AddFunction#547081
<function name="AddFunction" parent="DHTML" type="panelfunc">
<ispanel>yes</ispanel>
<description>
Defines a Javascript function that when called will call a Lua callback.
<note>Must be called after the HTML document has fully loaded.</note>
</description>
<realm>Client</realm>
<file line="123-L146">lua/vgui/dhtml.lua</file>
<args>
<arg name="library" type="string">Library name of the JS function you are defining.</arg>
<arg name="name" type="string">Name of the JS function you are defining.</arg>
<arg name="callback" type="function">Function called when the JS function is called. Arguments passed to the JS function will be passed here.</arg>
</args>
</function>
<example>
<description>Prints text from Javascript to the console in color.</description>
<code>
-- Create the frame
local frame = vgui.Create( "DFrame" )
frame:SetSize( 800, 600 )
frame:Center()
-- Create a green color variable
local color_green = Color( 0, 255, 0 )
-- Define the Javascript function in the DHTML element
local DHTML = vgui.Create( "DHTML", frame )
DHTML:Dock( FILL )
DHTML:OpenURL( "https://wiki.facepunch.com/gmod/DHTML" )
DHTML:AddFunction( "console", "luaprint", function( str )
MsgC( color_green, str ) -- Print the given string
end)
-- This runs our function. Our function could also be called from Javascript on the DHTML's page.
DHTML:RunJavascript( "console.luaprint( 'Hello from Javascript!' );" )
</code>
</example>
<example>
<description>
Passing a callback to the added JavaScript function as the last argument allows us to use the values returned by our Lua function.
⤶
Of course, you're allowed to use multiple return values, with each being its own argument. ⤶
Unsure how more complex variables like tables are processed however.⤶
As per https://github.com/Facepunch/garrysmod-issues/issues/3995#issuecomment-531491316
</description>
<code>
] lua_run_cl A = vgui.Create"DHTML"
] lua_run_cl A:OpenURL("https://duckduckgo.com/html/")
] lua_run_cl A:AddFunction("gmod", "test", function(x) return x end )
-- This works
] lua_run_cl A:RunJavascript("gmod.test('test', console.log)")
[HTML] test
] lua_run_cl A:AddFunction("gmod", "say", function(x) RunConsoleCommand("say", x) end)
] lua_run_cl A:RunJavascript("gmod.test('test', gmod.say)")
Bell: test
-- This doesn't work
] lua_run_cl A:RunJavascript("gmod.test(console.log, 'test')")
</code>
</example>