Преглед на файлове

provide ui.run_javascript and ui.await_javascript

Falko Schindler преди 2 години
родител
ревизия
43b2933328
променени са 3 файла, в които са добавени 31 реда и са изтрити 2 реда
  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)
 
+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()

+ 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})')
         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()
         request_id = str(uuid.uuid4())
         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
 
 
+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,
          route: str,
          title: Optional[str] = None,

+ 1 - 1
nicegui/ui.py

@@ -33,7 +33,7 @@ class Ui:
     from .elements.notify import Notify as notify
     from .elements.number import Number as number
     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.row import Row as row
     from .elements.select import Select as select