2010-02-14 15 views
1

我在我的html頁面上使用jquery,並希望在collection_select上有onchange事件。如何在jquery collection_select中有onchange

如果我添加<%= javascript_include_tag :defaults %>那麼我的jQuery代碼不起作用。

基本上我有一個collection_select如下:

<%=collection_select(:product, 'prod_name', @prods, :id, :prod_name, 
{:prompt => 'Select Product'},{:onchange => remote_function(:url => 
{:action => 'volume_or_quant'}, :with => "'id=' + this.value")})%> 

然後,我有一個選擇標記和文本字段:

<%=select_tag :volume, options_for_select(["", "1/8 lb", "1/4 lb", "Single", 
"Multi 5" ], "N/A") %> 
<%= text_field_tag :quantity, "", :size=>"4"%> 

當選項從collection_select選擇我要回去以我的行動,並檢查它是否有數據庫中的音量或單位。基於此,上面的選擇框/文本框將被啓用。

現在我的行​​動看起來像:

def volume_or_quant 
    @product = Product.find(params[:id]) 
    puts "Value: " + @product.volume   
end 

然而,當我選擇什麼......什麼也沒有發生。現在我沒有默認的JavaScript。

是我想要做的默認原型javascript?或者可以用jQuery來完成?

回答

3

是的,remote_function要求包含Prototype庫。它可以使用jQuery完成,但不能在您嘗試使用remote_function幫助程序時完成。

要獲取jQuery的工作:

當包括默認,發生的問題,是Prototype嘗試使用$,也是如此的jQuery。你可以使用jQuery的noConflict模式來解決這個問題。

包括像你試圖在第一,但聽從這個建議的默認值即可jQuery的再次合作:

你可以做幾件事情,但如果你使用jQuery的本地副本,添加此作爲最後一行(和在javascript_include_tag呼叫設置後,包括jQuery的):

jQuery.noConflict(); 

如果您使用的是谷歌CDN,這樣做:

<%= javascript_include_tag :defaults, "http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" %> 
<script type="text/javascript"> jQuery.noConflict() </script> 

然後,請確保您的所有jQuery代碼被包圍或者這個(對於以前住在document.ready任何代碼:

// $ = Prototype 
jQuery(document).ready(function($){ 
    // $ = jQuery 
}); 

// or shorthand: 
jQuery(function($){ 
    // $ = jQuery 
}); 

或使用此(創建一個私有範圍,其中$ = jQuery的):

// $ = Prototype 
(function($){ 
    // $ = jQuery 
})(jQuery); 
+0

我用noconflict做了這個。但我的jQuery UI標籤不起作用。 HTTP:// pastie。org/824022 – ratan 2010-02-14 03:23:50

+0

您的文檔準備好的調用是不正確的,並且它的重要的jquery包含在默認值之後*。這是它應該看起來(或接近)的方式:http://pastie.org/824043 – 2010-02-14 03:43:50

0

默認情況下,rails被配置或包含使用原型而不是jQuery,代碼<%= javascript_include_tag :defaults %>在運行時包含原型腳本到您的html。有一些插件用於像rails這樣的rails來啓用帶有rails的jQuery,但是它還沒有與rails完全集成。