OpalProxy
Opal Proxy provides a dynamic interface to JavaScript objects in Opal,
allowing seamless property access, method calls, and Promise handling using idiomatic Ruby syntax.
Installation
Add this line to your Gemfile:
gem 'opal_proxy'
Execute:
bundle install
Document example
require "js/proxy" class Document < JSProxy def initialize super($$.document) end end document = Document.new headers = document.querySelectorAll("h1") # or query_selector_all headers.each do |h1| h1.text_content = "Opal is great!" # or textContent end document.body.style.background_color = "lightblue" document.body.style.font_family = "Arial, sans-serif" document.body.style.color = "darkblue"
Window example
require "js/proxy" # ... including document class Window < JSProxy def initialize super($$.window) end end window = Window.new window.alert "Hello world!" window.set_timeout(-> { puts "1. Timeout test OK (1s delay)" }, 1000) window.fetch("https://jsonplaceholder.typicode.com/todos/1") .then do |response| response.json().then do |data| puts "5. Fetched: #{data["title"]}" document.get_element_by_id("output").inner_html += "<p>5. Fetched: #{data["title"]}</p>" end end
JQuery example
require "js/proxy" # ... including document doc = Document.new jquery_script = doc.createElement('script') jquery_script.src = "https://code.jquery.com/jquery-3.7.1.min.js" doc.head.appendChild(jquery_script) jquery_script.onload = -> { class JQuery < JS::Proxy def initialize(node) super(`$(node)`) end end document = JQuery.new($$.document) document.ready do paragraph = doc.createElement('p') paragraph.text_content = "If you click on me, I will disappear." doc.body.appendChild(paragraph) JQuery.new("p").click(&:hide) end }
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/josephschito/opal_proxy.
License
The gem is available as open source under the terms of the MIT License.