Monkey Patch选择jQuery库 - 选择总是未定义

时间:2013-01-30 12:12:55

标签: jquery monkeypatching jquery-chosen

我正在尝试在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);
        }
    }

有什么想法吗?

2 个答案:

答案 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)曾经用于公开ChosenAbstractChosen,但是在最新版本(截至2019-03-v1.8.7)中均未公开。 25)。相反,当前版本利用.data(key, value) jQuery methodChosen键下存储对chosen对象的引用。您可以尝试结合使用已初始化的选择列表和Object.getPrototypeOf JavaScript method来覆盖ChosenAbstractChosen函数。

例如,假设您在页面上的某处拥有

<select id="futureChosenSelect" ... >
  <option value="HiMom">Hi Mom!</option>
  ...
</select>

并且您已使用以下选项配置了<select>

$('#futureChosenSelect').chosen();

您应该能够使用类似以下内容的功能来覆盖这些功能:

Object.getPrototypeOf( $('#futureChosenSelect').data('chosen') ).no_results = function(terms) { ... };