我正在寻找一种使用 javascript 将元素附加到 javascript 的方法。基本上我有两个项目清单。一个有一个带有“添加”按钮的项目列表(使用“link_to_remote”),另一个有一个带有“删除”按钮的项目列表(使用“link_to_remote”)。当我单击“添加”时,它会立即将该项目放入另一个列表中。但是,我需要能够让新插入的项目执行“删除”的相反操作。
我看不到动态生成这种性质的动态项目的方法(此外,可能创建一个部分来呈现非对象)。
我正在寻找一种使用 javascript 将元素附加到 javascript 的方法。基本上我有两个项目清单。一个有一个带有“添加”按钮的项目列表(使用“link_to_remote”),另一个有一个带有“删除”按钮的项目列表(使用“link_to_remote”)。当我单击“添加”时,它会立即将该项目放入另一个列表中。但是,我需要能够让新插入的项目执行“删除”的相反操作。
我看不到动态生成这种性质的动态项目的方法(此外,可能创建一个部分来呈现非对象)。
你检查过jQuery吗?它是一个流行的 JavaScript 库。它可以轻松完成您所描述的操作。我已经用了很多年了,它从来没有让我失望过。
文档的此页面显示了该append()
方法。你可以做类似...
$("span").appendTo("#foo");
该$("span")
部分正在寻找 DOM 的一个元素(或多个元素),然后该appendTo("#foo")
部分将其附加到 DOM 的另一个元素。
您还可以附加任意 HTML 片段。如果需要,可以通过 AJAX 请求检索这样的片段。jQuery 具有非常简单可靠的 AJAX 支持。
使用 jQuery,基本概念是将 JavaScript 方法绑定到单独.js
文件中的 DOM 元素,而不是使用 HTML 的“ on_this
”或“ on_that
”属性。所以如果你在这种情况下使用 jQuery,你就不会想到通过模板生成 JS 代码。add()
and函数将remove()
在您的.js
文件中准备就绪,您可以根据需要将它们绑定和取消绑定到 DOM 元素。例如,当您将 an 添加li
到列表中时,您将取消绑定您的add()
函数li
并将函数绑定remove()
到它。
您可能正在寻找一些 javascript 模板解决方案。看看这个链接...
http://www.hokstad.com/mini-reviews-of-19-ruby-template-engines.html
希望这能回答你的问题。
警告:hacky 解决方案。
我有一个选择列表,我需要从中动态添加和删除元素。两者都是 AJAX 调用。
控制器方法呈现一个包含 Javascript 的部分,以从选择列表中添加和/或删除项目。部分,它是一个普通的旧 erb 文件,与任何其他部分一样,插入适当的 DOM 标识符(从列表中对象的对象 ID 生成)。
我查看了一些 Javascript 模板解决方案,但没有一个足够灵活。最后,自己生成 Javascript 更容易。
这很容易。有很多事情可以为你做这件事(查看 jquery)。
不久前我手工编写了一些东西(对不起,代码写得不好)。它从播放列表中添加和删除曲目
控制器:
def add_track
unless session[:admin_playlist_tracks].include?(params[:recording_id])
session[:admin_playlist_tracks] << params[:recording_id]
end
render :partial => "all_tracks"
end
def remove_track
session[:admin_playlist_tracks].delete_if {|x| x.to_s == params[:recording_id].to_s }
render :partial => "all_tracks"
end
容器:
<div id="artist_recordings" class="autocomplete_search"></div>
添加东西:
<%= link_to_remote "Add",
:url => {:controller => :playlists, :action => :add_track, :recording_id => recording.id},
:update =>"all_tracks",
:complete => visual_effect(:highlight, 'all_tracks') %>
显示/删除东西:
<%session[:admin_playlist_tracks].each do |recording_id|%>
<div style="margin-bottom:4px;">
[<%=link_to_remote "Remove",
:url => {:controller => :playlists, :action => :remove_track, :recording_id => recording_id},
:update =>"all_tracks"%>]
<%recording = Recording.find_by_id(recording_id)%>
<%=recording.song.title%> <br />
by <%=recording.artist.full_name%> (<%=recording.release_year%>)
</div>
<%end%>
这对我有用,因为我可以使用会话变量。不过要小心!在某些情况下,用户将拥有具有相同窗体的多个窗口,这肯定会中断,因为会话变量上会有并发访问。
缺少一些部分,因为我也在对此进行一些自动完成,但我希望这能帮助您了解大想法。