2013-03-15 66 views
2

我想在Ruby應用程序中運行jQuery並使用它來操縱HTML字符串。 (是的,我知道還有其他的Ruby庫可以處理這個任務,但在這種情況下,我有很好的理由使用jQuery)這是可能的嗎?我知道,我可以使用ExecJS在我的Ruby應用程序來執行簡單的JavaScript代碼,但jQuery的似乎並不奏效:在Ruby中運行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>' 

我如何得到這個工作?

+0

Ajedi我正在嘗試做類似的事情,並問這個問題:[在Web應用程序的服務器端和客戶端之間共享業務邏輯?](http://programmers.stackexchange.com/questions/202567/sharing -business-logic-between-server-side-and-client-side-of-web-application/202586?noredirect = 1#202586)讓我知道你發現了什麼! – thoughtpunch 2013-06-24 17:54:29

+0

@thoughtpunch不幸的是,我還沒有花時間進一步研究這個。 我想要做的是創建一種MVC庫,在Rails應用程序上運行客戶端和服務器端,這樣我就可以利用基於AJAX的快速頁面加載和動態JavaScript動畫,當用戶啓用了JavaScript,但當它們沒有時(或者當Googlebot出現時)仍然可以正常工作。我有幾點想法可以讓我能夠做到這一點,但沒有什麼堅實的... – Ajedi32 2013-06-24 18:19:40

回答

3

錯誤消息告訴你問題是什麼:

ExecJS::ProgramError: ReferenceError: window is not defined 

jQuery是對DOM操作庫。它期望看到所有通常的DOM對象和接口,包括window對象。

您正在使用的ExecJS庫不提供DOM或window對象。它提供了一個JavaScript執行上下文,但與瀏覽器不同。

您可能可以通過使用另一個庫(如JSDOM)來獲得此工作,以提供jQuery可以使用的DOM。這裏是a search that may give some tips

第一個鏈接描述了一個use of JSDOM and jQuery with ExecJS,它可能類似於你想要的。

這就是說,爲什麼jQuery?有幾個好的Ruby HTML parsers包括Nokogiri。爲什麼不嘗試其中之一?

+1

謝謝,這正是我正在尋找的。我想使用jQuery的原因非常複雜。基本上,我需要一個兼容[opal-jquery](https://github.com/opal/opal-jquery)的接口,以便我可以使用相同的代碼來操縱客戶端和服務器端的DOM。無論如何,這不是主意。 – Ajedi32 2013-03-15 11:50:02

-2

你不能在Ruby中運行jQuery。 jQuery不是用Ruby編寫的,而是用JavaScript編寫的,所以你需要運行一個JavaScript解釋器來使用它。

+0

呃,是的。但是我可以使用ExecJS運行其他JavaScript代碼。爲什麼不jQuery? – Ajedi32 2013-03-15 04:00:41

+0

jQuery被編寫爲在您無法在服務器端獲得的DOM上工作。但我相信你可以在服務器端使用它的實用方法,比如'$ .each'。 – HungryCoder 2013-03-15 04:27:22

+0

不,一旦我加載jQuery,我甚至不能評估1 + 1沒有得到這個錯誤。 – Ajedi32 2013-03-15 11:40:40