ruby.wasm ã® JS ã©ã¤ãã©ãªã¯ JavaScript ã«å¯¾ããèãã©ããã¼ãªã®ã§ããã®ã¾ã¾ã 㨠Ruby ã§ã¯ä½¿ãã«ãããã¨ãããã®ã§ãæè¿ã¯ JS ã Ruby ããã使ããããã«ããããã®ã©ã¤ãã©ãªãä½ã£ã¦ããã使ã£ã¦ãã
使ãæ¹
<!DOCTYPE html> <html> <script src="https://cdn.jsdelivr.net/npm/@ruby/[email protected]/dist/browser.script.iife.js"></script> <script type="text/ruby" src="https://cdn.jsdelivr.net/gh/tmtm/[email protected]/jsrb.rb"></script> <script type="text/ruby"> ... </script> </html>
JavaScript ã§æ¬¡ã®ã³ã¼ãã:
elements = document.querySelectorAll('div') elements.length elements[0].style.width
ruby.wasm ã® JS ã§æ¸ãã¨ãããªã:
elements = JS.global[:document].querySelectorAll('div') elements[:length] #=> 3 (JS::Object) elements[0][:style][:width] #=> "100px" (JS::Object)
JSrb ã ã¨ããæ¸ãã:
elements = JSrb.document.query_selector_all('div') elements.length #=> 3 (Integer) elements[0].style.width #=> "100px" (String)
Ruby ã½ãã
ããããã£ã []
ãªãã§åç
§ã§ãã
ruby.wasm JS ã¯ãobj ã®ããããã£ãåç
§ããã«ã¯ obj[:name]
ã¨æ¸ãå¿
è¦ãããã
JSrb ã 㨠obj.name
ã¨æ¸ããã
ãã ããããããã£ã¨ååã®é¢æ°ããã£ãããããå¼ã°ãã¦ãã¾ãã®ã§ããã®å ´å㯠[]
ã§åç
§ããå¿
è¦ãããã
undefined
ãè¿ãããããã£ããã®å½¢å¼ã§å¼ã¶ã¨ NoMethodError
ã«ãªã£ã¦ãã¾ãã®ã§ããã®å ´åã []
ã§åç
§ããå¿
è¦ãããã
ãã£ã¡ã«ã±ã¼ã¹ã®ããããã£ãã¡ã½ãããã¹ãã¼ã¯ã±ã¼ã¹ã§å¼ã¹ã
obj.querySelectorAll('div') â obj.query_selector_all('div')
div[:innerText]
â
div.inner_text
ã¿ãããªæããã¾ãããã¯ã好ã¿ã§â¦ã
å¤ã Ruby ã§æ±ããããããã«å¤æãã
ruby.wasm JS ã®æ»ãå¤ã¯å ¨é¨ JS::Object ãªãã ãã©ãRuby ã§æ±ãããã«å¤æããã®ãé¢åãªã®ã§ãæ°å¤ãæååãé åç㯠Ruby ã®åã«å¤æããããã«ããã
JavaScript | JSrb |
---|---|
number | Integer or Float |
string | String |
null | nil |
undefined | nil |
Array | Array |
Date | Time |
ããã以å¤ã®ãªãã¸ã§ã¯ã㯠JSrb ãªãã¸ã§ã¯ãã
length ããããã£ã¨ item() ã¡ã½ããããããªãã¸ã§ã¯ã㯠Enumerable ã«ãªã
NodeList ã®ããã«è¤æ°è¦ç´ ãæã¤ãªãã¸ã§ã¯ãã®åè¦ç´ ãåç §ããã«ã¯ãruby.wasm JS ã ã¨ãã¨ãã°ãããªé¢¨ã«ããªãã¨ãããªããã ãã©:
elements = JS.global[:document].querySelectorAll('div') elements[:length].to_i.times do |i| elements[i][:style][:color] = 'red' end
JSrb ã ã¨ãããªé¢¨ã«æ¸ãã:
elements = JSrb.document.query_selector_all('div') elements.each do |element| element.style.color = 'red' end
便å©ã
ãã®ä»
JSrb.window
JavaScript ã® window
ãªãã¸ã§ã¯ãã«å¯¾å¿
JSrb.global
JSrb.window
ã¨åã
JSrb.document
JavaScript ã® document
ãªãã¸ã§ã¯ãã«å¯¾å¿
JSrb.convert
JS::Object
ã Ruby ã§æ±ããããå½¢ã«å¤æãã:
JSrb.convert(JS.eval('return 123')) #=> 123 (Integer) JSrb.convert(JS.eval('return 123.45')) #=> 123.45 (Float) JSrb.convert(JS.eval('return [1,2,3]')) #=> [1, 2, 3] (Array) JSrb.convert(JS.eval('return "abc"')) #=> "abc" (String) JSrb.convert(JS.eval('return null')) #=> nil JSrb.convert(JS.eval('return undefined')) #=> nil JSrb.convert(JS.eval('return new Date')) #=> 2024-07-16 17:04:41.755 UTC (Time) JSrb.convert(JS.eval('return {a:1,b:2}')) #=> #<JSrb: [object Object]>
JSrb#to_h
JavaScript ã® Object ã Hash ã«å¤æãã:
JSrb.new(JS.eval('return {a:1,b:2}')).to_h #=> {:a=>1, :b=>2}
JSrb#js_object
JSrb
ãã©ãããã¦ãã JS::Object
ãè¿ã
JSrb#timeout(sec) { ... }
sec ç§å¾ã«ãããã¯ãå®è¡ãã
JS.global.setTimeout
ã¨ç°ãªãããããã¯å
㧠await ã使ããã
<script src="https://cdn.jsdelivr.net/npm/@ruby/[email protected]/dist/browser.script.iife.js"></script> <script type="text/ruby" src="jsrb.rb"></script> <script type="text/ruby" data-eval="async"> require 'js' def hoge = p JS.global.fetch("/").await JS.global.setTimeout(->{hoge}, 0) #=> Uncaught Error: /bundle/gems/js-2.6.2/lib/js.rb:86:in `await': JS::Object#await can be called only from RubyVM#evalAsync or RbValue#callAsync JS API JSrb.timeout(0){hoge} #=> OK! </script>