gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:36:38 25 4
gpt4 key购买 nike

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

第 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com