【发布时间】:2013-06-16 11:44:47
【问题描述】:
我正在使用带有 gem 'jquery-mobile-rails' 的 Rails 4.0.0rc1。 我正在尝试使用更改后的选择框的值在选择更改时隐藏和显示 DOM 元素。下面的代码在页面最初加载后工作。
一旦我点击一个 put-request-link jquery mobile 就会发送它的 AJAX 请求。 请求工作正常,更新数据库中的项目,更新后的项目正确显示在页面上。
AJAX 请求返回后,on_change 停止工作。代码如下:
<script type="text/javascript">
function show_selected() {
var selected_context_name = $('#context_description').val().replace(' ', '_');
$('.' + selected_context_name).show();
}
function hide_unselected() {
$('#context_description option').each(function(){
$('.' + $(this).val().replace(' ', '_')).hide();
});
}
$(document).on('pageinit', function(){
alert('INIT HIDING');
hide_unselected();
show_selected();
$('#context_description').bind('change', function(){
alert('CLICKED ON SELECT');
hide_unselected();
show_selected();
});
});
</script>
我正在使用的 link_to_method:
link_to(
item.description,
polymorphic_url(item, item_class => { done: !item.done? }, format: :mobile),
options.merge({
method: :put,
'data-role' => 'button'
})
)
每次单击更新链接时,都会收到“初始化隐藏”警报。更新后,不再显示“CLICKED ON SELECT”消息。所以我认为可以肯定地说绑定不起作用。不过我没有收到错误消息。
我尝试了$('#context_description').change(function(){ 和$('#context_description').on('change', function(){,结果相同。所有方法都有效,但仅在第一次运行时有效。
如何正确绑定?
我也看到了委托,我试图将事件绑定到文档,但现在事情变得非常混乱。我什至不知道这是关于 Rails 还是 jquery mobile 了。
附: 每次更新后,控制器都会显式地重定向回相同的路径(不使用 :back)。我检查了日志显示:'Started GET "/do.mobile"' 最初和 AJAX 返回后没有参数。
编辑: 我意识到更新项目后选择输入具有不同的数据主题。我强迫它使用相同的,但这并没有改变任何东西。也许这会激发某人的想法......
编辑: 更新后,将表单添加到 dom,使用用于更新的 url 作为操作参数,方法为“post”(不是“put”)。这是什么魔法?
编辑:我发现了两个带有“data-role”=page 的完整元素,包括每个页面的选择框和页面的全部内容。第一个页面元素设置为display: none; 那里的一个选择仍然有效。另一个没有,但是它们具有相同的ID。也许这里的重定向是错误的?
编辑:我尝试使用表单而不是 link_to 与 put 并没有设置 remote: true 明确...没有学到...
【问题讨论】:
-
#context....是动态添加的吗? -
按钮从 获取它的 id。要隐藏的项目也从底层模型中获得它们的类。所以:是的,它们是动态创建的。不过我检查了dom。 .change 函数的失败和成功调用所分配的 css-selector 是相同的。
-
好的,然后试试
$(document).on('change', '#context', function() -
谢谢!现在它接受了变化。但它没有正确执行隐藏,因为它获取了#context_description 选择的第一个实例的值。有没有办法 find_by_id 并使用最后一个?我知道你应该只有一个 id,但不知何故 jquery mobile 想出了整个页面的副本......
-
抱歉,我没听懂您的最后一条评论:/ 通过 id 查找什么?上一页的ID相同吗?与上面相同的代码,但选择器
$.mobile.activePage.prev('[data-role=page]').find('#context').val();来获取值。
标签: jquery jquery-mobile ruby-on-rails-4