Revision Difference
DHTML:AddFunction#547080
<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>⤶
⤶
</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.
⤶
-- 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.⤶
⤶
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>