3

Ruby アプリケーションで jQuery を実行し、それを使用して HTML 文字列を操作したいと考えています。(はい、そのタスクを処理できる Ruby ライブラリが他にもあることは知っていますが、この場合に jQuery を使用する正当な理由があります。) これは可能ですか? ExecJS を使用して Ruby アプリケーションで単純な JavaScript コードを実行できることはわかっていますが、jQuery は機能していないようです。

irb(main):001:0> require 'execjs'
=> true
irb(main):002:0> require 'open-uri'
=> true
irb(main):003:0> context = ExecJS.compile(open("http://code.jquery.com/jquery-1.9.1.js").read)
=> <Return omitted for brevity>
irb(main):004:0> context.call("$", "<div>Test</div>")
ExecJS::ProgramError: ReferenceError: window is not defined
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/execjs-1.4.0/lib/execjs/external_runtime.rb:68:in `extract_result'
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/execjs-1.4.0/lib/execjs/external_runtime.rb:28:in `block in exec'
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/execjs-.4.0/lib/execjs/external_runtime.rb:41:in `compile_to_tempfile'
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/execjs-.4.0/lib/execjs/external_runtime.rb:27:in `exec'
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/execjs-.4.0/lib/execjs/external_runtime.rb:19:in `eval'
        from c:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/execjs-.4.0/lib/execjs/external_runtime.rb:33:in `call'
        from (irb):4
        from c:/RailsInstaller/Ruby1.9.3/bin/irb:12:in `<main>'

これを機能させるにはどうすればよいですか?

4

2 に答える 2

4

エラーメッセージは、問題が何であるかを示しています。

ExecJS::ProgramError: ReferenceError: window is not defined

jQueryはDOM操作用のライブラリです。オブジェクトを含む、通常のDOMオブジェクトとインターフェイスがすべて表示されることを期待していwindowます。

使用しているExecJSライブラリは、DOMまたはwindowオブジェクトを提供していません。JavaScript実行コンテキストを提供しますが、ブラウザーが提供するものと同じではありません。

JSDOMなどの別のライブラリを使用してjQueryが使用できるDOMを提供することで、これを機能させることができる場合があります。ここにいくつかのヒントを与えるかもしれない検索があります

最初のリンクは、ExecJSでのJSDOMとjQueryの使用法を説明しています。

そうは言っても、なぜjQueryなのか?Nokogiriを含むいくつかの優れたRubyHTMLパーサーがあります。それらの1つを試してみませんか?

于 2013-03-15T04:20:12.373 に答える
-4

Ruby で jQuery を実行することはできません。jQuery は Ruby ではなく JavaScript で記述されているため、使用するには JavaScript インタープリターを実行する必要があります。

于 2013-03-15T02:58:13.007 に答える