javascript - 有人可以解释 Bootstrap 4 Button Javascript 的 jQuery/JQUERY_NO_CONFLICT 特定代码吗?

标签 javascript jquery twitter-bootstrap web

我大致了解为什么没有冲突很重要以及这里发生了什么。然而,我试图更好地理解为什么这些特定的代码行很重要,是替代方案,并且只是想更清楚地了解为什么作者在设置此模式时选择了这个方向。

第 1 部分:

static _jQueryInterface(config) {
  return this.each(function () {
    let data = $(this).data(DATA_KEY)

    if (!data) {
      data = new Button(this)
      $(this).data(DATA_KEY, data)
    }

    if (config === 'toggle') {
      data[config]()
    }
  })
}

第 2 部分:

$.fn[NAME]             = Button._jQueryInterface
$.fn[NAME].Constructor = Button
$.fn[NAME].noConflict  = function () {
  $.fn[NAME] = JQUERY_NO_CONFLICT
  return Button._jQueryInterface
}

完整来源:

/**
 * --------------------------------------------------------------------------
 * Bootstrap (v4.0.0-alpha.2): button.js
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */

const Button = (($) => {


  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  const NAME = 'button'
  const VERSION = '4.0.0-alpha.2'
  const DATA_KEY = 'bs.button'
  const EVENT_KEY = `.${DATA_KEY}`
  const DATA_API_KEY = '.data-api'
  const JQUERY_NO_CONFLICT = $.fn[NAME]

  const ClassName = {
    ACTIVE: 'active',
    BUTTON: 'btn',
    FOCUS: 'focus'
  }

  const Selector = {
    DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
    DATA_TOGGLE: '[data-toggle="buttons"]',
    INPUT: 'input',
    ACTIVE: '.active',
    BUTTON: '.btn'
  }

  const Event = {
    CLICK_DATA_API: `click${EVENT_KEY}${DATA_API_KEY}`,
    FOCUS_BLUR_DATA_API: `focus${EVENT_KEY}${DATA_API_KEY} ` + `blur${EVENT_KEY}${DATA_API_KEY}`
  }


  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */

  class Button {

    constructor(element) {
      this._element = element
    }


    // getters

    static get VERSION() {
      return VERSION
    }


    // public

    toggle() {
      let triggerChangeEvent = true
      let rootElement = $(this._element).closest(
        Selector.DATA_TOGGLE
      )[0]

      if (rootElement) {
        let input = $(this._element).find(Selector.INPUT)[0]

        if (input) {
          if (input.type === 'radio') {
            if (input.checked &&
              $(this._element).hasClass(ClassName.ACTIVE)) {
              triggerChangeEvent = false

            } else {
              let activeElement = $(rootElement).find(Selector.ACTIVE)[0]

              if (activeElement) {
                $(activeElement).removeClass(ClassName.ACTIVE)
              }
            }
          }

          if (triggerChangeEvent) {
            input.checked = !$(this._element).hasClass(ClassName.ACTIVE)
            $(this._element).trigger('change')
          }
        }
      } else {
        this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE))
      }

      if (triggerChangeEvent) {
        $(this._element).toggleClass(ClassName.ACTIVE)
      }
    }

    dispose() {
      $.removeData(this._element, DATA_KEY)
      this._element = null
    }


    // static

    static _jQueryInterface(config) {
      return this.each(function() {
        let data = $(this).data(DATA_KEY)

        if (!data) {
          data = new Button(this)
          $(this).data(DATA_KEY, data)
        }

        if (config === 'toggle') {
          data[config]()
        }
      })
    }

  }


  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */

  $(document)
    .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
      event.preventDefault()

      let button = event.target

      if (!$(button).hasClass(ClassName.BUTTON)) {
        button = $(button).closest(Selector.BUTTON)
      }

      Button._jQueryInterface.call($(button), 'toggle')
    })
    .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {
      let button = $(event.target).closest(Selector.BUTTON)[0]
      $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))
    })


  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $.fn[NAME] = Button._jQueryInterface
  $.fn[NAME].Constructor = Button
  $.fn[NAME].noConflict = function() {
    $.fn[NAME] = JQUERY_NO_CONFLICT
    return Button._jQueryInterface
  }

  return Button

})(jQuery)

export default Button

非常感谢您的任何意见,我真的很感激!

最佳答案

这个

$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {

相当于

$(document).on('click.bs.button.data-api', '[data-toggle^="button"]', (event) => {

根据jQuery's on docs您可以命名事件名称以避免删除不属于您自己的附加事件。因此,一个按钮可以有两个 on 事件,一个是 BS4,另一个是您自己的代码。

^ is a selector对于“开始于”。

这样做的原因是,如果您想要 BS4 按钮上的切换状态,则必须创建数据属性为 data-toggle='button' 的按钮。

noConflict作品like this 。基本上它允许您将 Bootstrap 插件/模式重新分配给不同的变量。

var f = $.fn.button.noConflict();
$.fn.bootstrapBtn = f;
$('#bt2').click(function() {
  $('#bt1').bootstrapBtn('toggle');
})

关于javascript - 有人可以解释 Bootstrap 4 Button Javascript 的 jQuery/JQUERY_NO_CONFLICT 特定代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34228370/

相关文章:

javascript - MEAN 应用程序 - 无法在我的查找请求中使用查询

javascript - 也许 PHP 还记得颜色?

java - 从本地主机引用标签库

html - Bootstrap 轮播中心图像垂直和水平

html - 为什么我的 <li> 没有得到 "active"?

jquery - jPanel 与 Bootstraps 模式窗口混淆

javascript - Angular 击键观察器未正确更新范围

javascript - 在 html 中将 'onclick' 用于仅工作一次的 javascript 函数

javascript - 自定义编辑弹出模板中的 Kendo Scheduler 附加按钮

jQuery + jqgrid postData 覆盖默认值