You could create a custom ReactiveHTML class like below.
import param
import panel as pn
class Javascript(pn.reactive.ReactiveHTML):
value = param.String(
default="",
allow_None=False,
doc="""Javascript code. When the value is set it will be evaluated in the browser.
Afterwards the value will be set to ''""",
)
def __init__(self):
super().__init__(height=0, width=0, margin=0)
def eval(self, value: str):
self.value = value
_template = "<div id='pn-container'></div>"
_scripts = {
"value": """
console.log(data.value)
if (data.value!=''){
eval(data.value)
data.value=""
}"""
}
javascript = Javascript()
menu_items = [
("Twitter", "https://twitter.com/Panel_org"),
("LinkedIn", "https://www.linkedin.com/company/panel-org/"),
("Discourse", "https://discourse.holoviz.org/"),
]
menu_button = pn.widgets.MenuButton(
name="Dropdown", items=menu_items, button_type="primary"
)
@pn.depends(menu_button.param.clicked, watch=True)
def handle_selection(value):
code = f"window.location.href='{value}'"
javascript.eval(code)
pn.Column(
menu_button,
javascript,
).servable()