Javascript 向Bootstrap.js添加自定义函数
我最近遇到了一种情况,在这种情况下,我想从根本上改变引导的默认行为。我想在Javascript 向Bootstrap.js添加自定义函数,javascript,plugins,twitter-bootstrap,parameter-passing,prototype,Javascript,Plugins,Twitter Bootstrap,Parameter Passing,Prototype,我最近遇到了一种情况,在这种情况下,我想从根本上改变引导的默认行为。我想在Modal类中添加一个自定义方法,以便可以像调用任何其他stockModal方法一样调用自定义方法: $('#my-modal').modal('myMethod', myParameter); 我通过向模态的构造函数添加一个函数来实现这一点: $.fn.modal.Constructor.prototype.myMethod = function (myParameter) { ... } 但是,未传递myPar
Modal
类中添加一个自定义方法,以便可以像调用任何其他stockModal
方法一样调用自定义方法:
$('#my-modal').modal('myMethod', myParameter);
我通过向模态
的构造函数添加一个函数来实现这一点:
$.fn.modal.Constructor.prototype.myMethod = function (myParameter) {
...
}
但是,未传递
myParameter
变量。如何访问/传递myParameter
到自定义引导方法?您无法按原样执行此操作。用于调用函数的模型不考虑参数
$.fn.modal = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('modal')
, options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('modal', (data = new Modal(this, options)))
if (typeof option == 'string') data[option]() // <-- here
else if (options.show) data.show()
})
}
我找到了一种方法来做到这一点,尽管不幸的是它涉及到对引导源的更改。执行实际方法调用的代码如下:
$.fn.modal = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('modal')
, options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('modal', (data = new Modal(this, options)))
if (typeof option == 'string') data[option]()
else if (options.show) data.show()
})
}
要改变这一点,应修改第7行(中的第206行),以传递最初传递给封闭函数的任何附加参数。此外,必须为jQuery的.each()
函数的每次迭代提供原始参数。以下是工作代码:
$.fn.modal = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('modal')
, options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('modal', (data = new Modal(this, options)))
if (typeof option == 'string') data[option].apply($this.data('modal'), Array.prototype.slice.call(arguments, 1)); // pass the parameters on
else if (options.show) data.show()
}, arguments) // execute each iteration with the original parameters
}
我仍在试验,以确保这一变化不会产生任何不良副作用,但到目前为止,一切都按预期进行。任何更优雅的解决方案都将受到欢迎
$.fn.modal = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('modal')
, options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('modal', (data = new Modal(this, options)))
if (typeof option == 'string') data[option].apply($this.data('modal'), Array.prototype.slice.call(arguments, 1)); // pass the parameters on
else if (options.show) data.show()
}, arguments) // execute each iteration with the original parameters
}