现在我已升级到Rails 3,我正试图找出分离和重用javascript片段的正确方法。这是我正在处理的场景:
我有一个包含两个区域的页面:一个包含应该可拖动的元素,另一个包含droppables。
当页面加载时,我使用jQuery来设置draggables和droppables。目前我在application.html.erb的头部有脚本,我确信这不是正确的解决方案,但至少可行。
当我按下页面上的按钮时,会向我的控制器发出一个ajax调用,该调用用一组新的元素替换draggables,这些元素也应该是可拖动的。我有一个js.erb文件,在正确的位置呈现部分。渲染后我需要使新元素可拖动,所以我想重用当前存在于application.html.erb中的代码,但我没有找到正确的方法来实现它。我只能通过将代码直接粘贴到我的js.erb文件(yuck)中来使新元素可拖动。
我想要的是: - 包含prepdraggables()和prepdroppables()函数的javascript文件 - 从application.html.erb或js.erb文件中调用函数的方法
我尝试过使用:content_for来存储和重用代码,但似乎无法使其正常工作。
我目前在application.html.erb
的head部分中有什么内容<% content_for :drag_drop_prep do %>
<script type="text/javascript" charset="utf-8">
$(document).ready(function () {
// declare all DOM elements with class draggable to be draggable
$( ".draggable" ).draggable( { revert : 'invalid' });
// declare all DOM elements with class legal to be droppable
$(".legal").droppable({
hoverClass : 'legal_hover',
drop : function(event, ui) {
var c = new Object();
c['die'] = ui.draggable.attr("id");
c['cell'] = $(this).attr("id");
c['authenticity_token'] = encodeURIComponent(window._token);
$.ajax({
type: "POST",
url: "/placeDie",
data: c,
timeout: 5000
});
}});
});
</script>
<% end %>
undo.js.erb
$("#board").html("<%= escape_javascript(render :partial => 'shared/board', :locals => { :playable => true, :restartable => !session[:challenge]}) %>")
// This is where I want to prepare draggables.
<%= javascript_include_tag "customdragdrop.js" %> // assuming this file had the draggables code from above in a prepdraggables() function
prepdraggables();
答案 0 :(得分:3)
难道你不能将drag_drop_prep中的代码放入函数中,然后从application.html.erb和每个部分调用函数吗?我猜我错了。
function prepdraggables(){
// declare all DOM elements with class draggable to be draggable
$( ".draggable" ).draggable( { revert : 'invalid' });
// declare all DOM elements with class legal to be droppable
$(".legal").droppable({
hoverClass : 'legal_hover',
drop : function(event, ui) {
var c = new Object();
c['die'] = ui.draggable.attr("id");
c['cell'] = $(this).attr("id");
c['authenticity_token'] = encodeURIComponent(window._token);
$.ajax({
type: "POST",
url: "/placeDie",
data: c,
timeout: 5000
});
}});
}
在application.html.erb和undo.js.erb中:
prepdraggables();