Browse Source

provide ui.run_javascript and ui.await_javascript

Falko Schindler 2 years ago
parent
commit
43b2933328
3 changed files with 31 additions and 2 deletions
  1. 19 0
      main.py
  2. 11 1
      nicegui/elements/page.py
  3. 1 1
      nicegui/ui.py

+ 19 - 0
main.py

@@ -665,4 +665,23 @@ with example(sessions):
 
 
     ui.link('Visit session demo', session_demo)
     ui.link('Visit session demo', session_demo)
 
 
+javascript = '''#### JavaScript
+
+With `ui.run_javascript()` you can run arbitrary JavaScript code on a page that is executed in the browser.
+The asynchronous function will return after sending the command.
+
+With `ui.await_javascript()` you can send a JavaScript command and wait for its response.
+The asynchronous function will only return after receiving the result.
+'''
+with example(javascript):
+    async def run_javascript():
+        await ui.run_javascript('alert("Hello!")')
+
+    async def await_javascript():
+        response = await ui.await_javascript('Date()')
+        ui.notify(f'Browser time: {response}')
+
+    ui.button('run JavaScript', on_click=run_javascript)
+    ui.button('await JavaScript', on_click=await_javascript)
+
 ui.run()
 ui.run()

+ 11 - 1
nicegui/elements/page.py

@@ -104,7 +104,7 @@ class Page(jp.QuasarPage):
                 raise ValueError(f'invalid number of arguments (0 or 1 allowed, got {arg_count})')
                 raise ValueError(f'invalid number of arguments (0 or 1 allowed, got {arg_count})')
         await super().on_disconnect(websocket)
         await super().on_disconnect(websocket)
 
 
-    async def await_javascript(self, code: str, check_interval: float = 0.01, timeout: float = 1.0) -> str:
+    async def await_javascript(self, code: str, *, check_interval: float = 0.01, timeout: float = 1.0) -> str:
         start_time = time.time()
         start_time = time.time()
         request_id = str(uuid.uuid4())
         request_id = str(uuid.uuid4())
         await self.run_javascript(code, request_id=request_id)
         await self.run_javascript(code, request_id=request_id)
@@ -129,6 +129,16 @@ def add_body_html(self, html: str) -> None:
         page.body_html += html
         page.body_html += html
 
 
 
 
+async def run_javascript(self, code: str) -> None:
+    for page in get_current_view().pages.values():
+        await page.run_javascript(code)
+
+
+async def await_javascript(self, code: str, *, check_interval: float = 0.01, timeout: float = 1.0) -> None:
+    for page in get_current_view().pages.values():
+        return await page.await_javascript(code)
+
+
 def page(self,
 def page(self,
          route: str,
          route: str,
          title: Optional[str] = None,
          title: Optional[str] = None,

+ 1 - 1
nicegui/ui.py

@@ -33,7 +33,7 @@ class Ui:
     from .elements.notify import Notify as notify
     from .elements.notify import Notify as notify
     from .elements.number import Number as number
     from .elements.number import Number as number
     from .elements.open import open, open_async
     from .elements.open import open, open_async
-    from .elements.page import page, add_head_html, add_body_html
+    from .elements.page import page, add_head_html, add_body_html, run_javascript, await_javascript
     from .elements.radio import Radio as radio
     from .elements.radio import Radio as radio
     from .elements.row import Row as row
     from .elements.row import Row as row
     from .elements.select import Select as select
     from .elements.select import Select as select