我正在尝试在Chosen jQuery库中修补两个函数,但是,无论我试图引用原始函数,控制台返回Chosen都是未定义的。
这是我的代码。
function(){
var _no_results = window.jQuery.fn.chosen.prototype.no_results;
var _no_results_clear = window.jQuery.fn.chosen.prototype.no_results_clear;
window.jQuery.fn.chosen.prototype.no_results = function (terms) {
console.log('nr');
var no_results_html;
no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
no_results_html.find("span").first().html(terms);
if (this.options.no_results_callback) {
this.options.no_results_callback(no_results_html, terms);
}
return this.search_results.append(no_results_html);
//return _no_results.apply(terms);
}
window.jQuery.fn.chosen.prototype.no_results_clear = function (terms) {
console.log('nrc');
var no_results_html;
no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
no_results_html.find("span").first().html(terms);
if (this.options.no_results_clear_callback) {
this.options.no_results_clear_callback(no_results_html, terms);
}
return this.search_results.find(".no-results").remove();
//return _no_results_clear.apply(terms);
}
}
有什么想法吗?
答案 0 :(得分:0)
不要复制原型,这不是jQuery的工作原理。 Internaly它将插件和变量存储在地图中(名称 - &gt;功能)。这应该有效:
var _no_results = window.jQuery.jQuery.fn['chosen'].no_results;
var _no_results_clear = window.jQuery.fn['chosen'].no_results_clear;
window.jQuery.fn['chosen'].no_results = function (terms) {
...
_no_results.apply(this, terms);
}
window.jQuery.fn['chosen'].no_results_clear = function (terms) {
...
_no_results_clear.apply(this, terms);
}
我做了一次,用于替换选择器链的内部日志的jQuery内部函数。 Check here how it works (github)
答案 1 :(得分:0)
似乎所选库的较旧版本(例如v0.9.14)曾经用于公开Chosen
和AbstractChosen
,但是在最新版本(截至2019-03-v1.8.7)中均未公开。 25)。相反,当前版本利用.data(key, value)
jQuery method在Chosen
键下存储对chosen
对象的引用。您可以尝试结合使用已初始化的选择列表和Object.getPrototypeOf
JavaScript method来覆盖Chosen
或AbstractChosen
函数。
例如,假设您在页面上的某处拥有
<select id="futureChosenSelect" ... >
<option value="HiMom">Hi Mom!</option>
...
</select>
并且您已使用以下选项配置了<select>
:
$('#futureChosenSelect').chosen();
您应该能够使用类似以下内容的功能来覆盖这些功能:
Object.getPrototypeOf( $('#futureChosenSelect').data('chosen') ).no_results = function(terms) { ... };