【问题标题】:Jquery Mobile: Binding on "change" not excuted after redirect (rails 4)Jquery Mobile:重定向后未执行“更改”绑定(rails 4)
【发布时间】: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


【解决方案1】:

要将事件附加到动态插入的项目,请使用...

$(document).on('change', '.selector', function () { code });

通过 id 获取动态项的值(在您的情况下)...

$.mobile.activePage.find('#id').val();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    相关资源
    最近更新 更多