【问题标题】:Reference a Coffeescript event in a separate JS file在单独的 JS 文件中引用 Coffeescript 事件
【发布时间】:2013-07-26 01:51:24
【问题描述】:

基本上我已经有一段可动画下拉菜单的coffeescript:

menu_in  = -> $('.cart_pulldown').slideDown(250)
menu_out = -> $('.cart_pulldown').slideU(150)

$('#store_menu').hoverIntent(over: menu_in, out: menu_out, timeout: 150)

我想将它与添加到购物车按钮的操作联系起来,以便在用户添加到购物车时发生菜单 slideDown/slideUp 序列,这是 js 代码:

function set_product_page_variant_state() {
var varel = $('div#product-social-links');
var cart_link = $("#add-to-cart-button");
if(varel && cart_link) {
  if(variant_id = varel.attr('data-variant-id')) {
    $.post('/flash_sales/get_state.json', {'variant_ids[]': [variant_id]}, function(data) {
      var state = data[variant_id];
      if(state) {
        if(state=='on_hold') { 
          cart_link.text("On Hold").show();
        } else if(state=='in_my_cart') {
          // TODO: this is funking ugly and slow to load, this whole thing needs a good old fashion refactorin'.
          cart_link.text("In My Cart")
            .hide()
            .after("<a href='/cart' class='action-button add_to_cart' id='#add-to-cart-button'>In My Cart</a>")
            .remove()
        } else if(state=='available') {
          cart_link.removeAttr('disabled').show();
        } else if(state=='sold_out') {
          cart_link.text("Sold Out").show()
        } else {
        // something went wrong, enable the button
          cart_link.removeAttr('disabled').show()
        }
      } else { cart_link.removeAttr('disabled').show() }
    }); 
  } else { cart_link.removeAttr('disabled').show() }
 }
}

为了彻底,这里是相关的 html:

 <div id="cart-form">
                   <%= form_for :order, :url => spree.populate_orders_url do |f| %>
                     <div id="inside-product-cart-form" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
                       <% if @product.price %>
                         <div>
                           <div class="add-to-cart">
                             <%= hidden_field_tag "variants[#{@variant.id}]", 1 %>
                             <%= button_tag "Add to Cart", :class => "hidden action-button add_to_cart", :type => :submit, :disabled => true, :id => "add-to-cart-button" %>
                           </div>
                         </div>
                       <% end %>
                     </div>
                   <% end %>
                 </div>

非常感谢任何建议,在此先感谢!

【问题讨论】:

    标签: javascript jquery ruby-on-rails dom coffeescript


    【解决方案1】:

    您可以在 Coffeescript 文件中使用 jQuery 委托事件。例如,在触发menu_out之前显示菜单500ms:

    $(document).on 'click', '#add-to-cart-button', (event) ->
      menu_in()
      setTimeout 500, menu_out
    

    【讨论】:

    • 通过触发器,除了调用:menu_in menu_out之外我还需要做什么
    • 您需要为第二次通话设置超时。更新了上面的代码以反映这一点。
    【解决方案2】:

    由于 CoffeeScript 将您的代码放在一个闭包中,您需要手动将全局变量附加到窗口,例如 window.menu_in = -&gt; ...

    【讨论】:

    • 我不确定我理解你的意思,你能再详细说明一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2013-09-23
    • 2014-02-18
    • 2021-06-02
    • 2014-07-02
    相关资源
    最近更新 更多