繁体   English   中英

绑定 .click 和 .blur 事件处理程序

[英]Binding .click and .blur event handlers

我遇到了将.blur.click事件处理程序绑定到同一个可点击元素的问题。 我要的用户体验如下:

用户点击搜索图标并出现搜索字段; 当用户再次单击搜索图标时,他们可以折叠并隐藏搜索字段。 如果他们点击离开,搜索字段应该隐藏。

到目前为止,我能够实现大部分我想要的,除了我无法获得.click绑定以在单击后切换类。 我认为这可能是因为在切换$选择器后没有任何结果可供选择? 我对 JavaScript 比较陌生,所以我不太清楚 JavaScript 或 jQuery 究竟如何处理这样的事情。

Jsfiddle在这里:http: //jsfiddle.net/TpXJe/1/

编辑:在此处包含代码,以便将来的 Stack Overflow 用户可以看到它:


html:

<form class="hidden-xs search-container navbar-right search-form" method="get">
    <div class="input-group">
        <input id="search-box" type="search" class="search-box" name="s" class="search-field form-control" />
        <label class="hide">Search for something</label>
        <label for="search-box"><span id="searchDivider">|</span>

            <div class="icon-continer"> <span class="glyphicon glyphicon-search search-icon"></span>

            </div>
        </label>
       </div>
</form>

CSS:

.search-container {
  right: 0px;
}

#searchDivider {
  position: absolute;
  right: 0px;
  top:31px;
  z-index: 1;
  color: @brand-success;
  cursor: pointer;
  font-weight: 200;

}
// Style the search box



$tl: .3s; // transition length

.search-box {
  outline-width: 0;
  transition: width $tl, border-radius $tl, background $tl;
  position: absolute;
  right:-37px;
  top: 20px;
  z-index: 100;
  width: 40px;
  height: 40px;
  border-radius: 20px;
  border: none;
  cursor: pointer;
  background: transparent;
  & + label .search-icon {
    color: black    }
  &:hover {
    color: white;
    background: transparent;
    box-shadow: 0 0 0 1px transparent;
    & + label .search-icon {
       color: white    }
  }
  &.focused {
    transition: width $tl cubic-bezier(.18,.57,.25,.94), border-radius $tl;
    border: none;
    outline: none;
    box-shadow: none;
    padding-left: 15px;
    cursor: text;
    width: 600px;
    border: 1px solid black;
    border-radius: auto;
    background: white;
    color: black;
    & + label .search-icon {
      color: black;    }
  }
  &:not(:focus) {
    text-indent:-5000px;    } // for more-graceful falling back (:not browsers likely support indent)
}

#search-submit {
  position: relative;
  left: -5000px;
}

.search-icon {
  position: absolute;
  right: -45px;
  top: 14px;
  z-index: 1000;
  color: black;
  cursor: pointer;
  width: 60px;
  height: 60px;
  padding: 23px;
}

js:

  $('.search-icon').click(
  function () {
      $('.search-box ').toggleClass(' .search-box focused');
  });
  $('.search-box').blur(
  function () {
      $('.search-box').removeClass('focused');
  });

正如 Ehsan 在评论中所说,似乎在已单击图标时单击该图标会触发 click() 和 blur() 事件。 我刚刚添加了一个变量来表示单击/未单击的状态,它对我有用! 在下面更新的小提琴中,我相信你打算做的就是 Jacob 在评论中提到的 - 类名是“focused”而不是“.search-box focus”。

更新了 JSFiddle 链接

这是JS代码:

var clicked = false;

$('.search-icon').click(

  function () {
      if (clicked) {
      $('.search-box ').removeClass('focused');
          clicked = false;
      } else {
          $('.search-box ').addClass('focused');
          clicked = true;
      }
  });


  $('.search-box').blur(

  function () {
      $('.search-box').removeClass('focused');

我最近所说的是将我所有的事件侦听器设置为变量(对象)。 它使得能够将多个事件分配给单个对象非常容易。

/**
 * Event listeners.
 * Params: element, event : method
 * NOTE: element is passed in as a string, not jQuery object!
 * This so we have the possibility of multiple events for a single element (eg.    focus & change for the same element). 
 * 
 */
 eventHandlers: {
     'a click': 'onAnchorClick',
     'a hover': 'onAnchorHover'
 }, 


/**
 * Registers all event listeners/handlers.
 * @returns {void}
 * 
 */
registerEventHandlers: function() {
    var that = this;
    $.each(this.eventHandlers, function(key, val) {
        var split = key.split(" ");
        var element = split[0];
        var event = split[1];
        $(document).on(event, element, that[val]);
     });
 }

...

/**
 * Event listener for all anchor click events.
 * @param {object} event | The click event.
 * @returns {void}
 * 
 */
onAnchorClick: function(event) {
     console.log('click event');

    // For example purposes:
    var ga_eventData = {
        'category': 'Text Link',
        'action': 'Click',
        'label': event.currentTarget.innerText,
        'optionalData': {
            'page': window.location.protocol + '//' + window.location.host + window.location.pathname
            }
        }
        GA.registerEvent(ga_eventData);  // GA is my google analytics module in this example
},
/**
 * Event listener for all anchor hover events.
 * @param {object} event | The hover event.
 * @returns {void}
 * 
 */
onAnchorHover: function(event) {
    console.log('hover event');
}

...

然后在我的初始化方法中,我简单地调用:

/**
 * Initialization method.
 * @returns {void}
 * 
 */
initialize: function() {
    var that = this;
    that.registerEventHandlers();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM