【问题标题】:Autocomplete customize it - Jquery自动完成自定义它 - Jquery
【发布时间】:2009-10-13 12:20:15
【问题描述】:

在我开始提问之前,我知道你们中的一些人不会仔细阅读这个问题,并且会认为我要求像 addClass("custom1") 到我原来的 #elem 这样简单的东西,像这样:

$("#elem1").autocomplete("source1.php").addClass("custom1");

这不会这样做,因为我没有尝试将类添加到我的目标 div...我正在尝试将它添加到插件的动态生成的 div生成。

现在回答我的问题 :) 提前致谢

我有几个这样的自动完成功能:

$("#elem1").autocomplete("source1.php"); 
$("#elem2").autocomplete("source2.php");
$("#elem3").autocomplete("source3.php");

默认情况下,每个结果都会在名为.ac_results 的单独 div 类中返回,该类会在正文关闭之前添加。

   <div class="ac_results" style="display: none;">
      <ul style="overflow: auto; max-height: 180px;">
        //the results here as li's.. they vary with what you typed
      </ul>
   </div>
   <div class="ac_results" style="display: none;">
      <ul style="overflow: auto; max-height: 180px;">
        //**THESE LIs ARE DIFFERENT FROM THE SET ABOVE**
      </ul>
   </div>
   <div class="ac_results" style="display: none;">
      <ul style="overflow: auto; max-height: 180px;">
        //**THESE LIs ARE EVEN DIFFERENT FROM THE 2 SETS ABOVE**
      </ul>
   </div>
</body>

我有一个自定义类,虽然 对于每个 #elem 我需要添加到插件动态生成的 div 中,以使最终结果看起来像这样:(唯一的变化是我添加custom1 custom2 custom3类)

   <div class="ac_results custom1" style="display: none;">
      <ul style="overflow: auto; max-height: 180px;">
        //the results here as li's.. they vary with what you typed
      </ul>
   </div>
   <div class="ac_results custom2" style="display: none;">
      <ul style="overflow: auto; max-height: 180px;">
        //**THESE LIs ARE DIFFERENT FROM THE SET ABOVE**
      </ul>
   </div>
   <div class="ac_results custom3" style="display: none;">
      <ul style="overflow: auto; max-height: 180px;">
        //**THESE LIs ARE EVEN DIFFERENT FROM THE 2 SETS ABOVE**
      </ul>
   </div>
</body>

所以我需要:

  • 以某种方式完全清除默认的 .ac_results 并在每个 .autocomplete() 声明中将其替换为我自己的类(每个 elem 的不同类)
  • 或保留ac_results 并在渲染后添加我的自定义类(每个自动完成不同)

问题:

  • 插件生成的 html div 看起来都一样。不检查 li 的内容,你是无法分辨的。

  • html div 仅在您开始为该#elem 输入自动完成之后 生成,AND 以最后使用的为准,在正文之前最后添加到 DOM关闭。

    • 这意味着我不能使用 DOM 顺序来映射它们
    • 在第一次渲染 html 时,DOM 不会有任何div class="ac_results"。如果使用了#elem3,则会为其添加一个div class="ac_results"。如果#elem1在之后使用,另一个div class="ac_results"会被添加,所以elem1的div实际上是在elem3的div之后,因此我所说的不能使用订单。

一些额外信息

我正在使用 JQuery 自动完成 1.1。这个来自 jquery 问题的链接是一个非常接近的文件,虽然不完全相同 http://plugins.jquery.com/files/issues/jquery.autocomplete.js__0.txt

从文件中,我的硬盘上有一些代码。我删除了大部分不重要的行。最重要的是resultsClass: "ac_results",这是自动生成的 div 类。

   $.Autocompleter.defaults = {
        inputClass: "ac_input",
        resultsClass: "ac_results",
        loadingClass: "ac_loading",
        extraParams: {},
    };

resultClass 稍后会在函数 init() 中使用,为了以防万一,我会完整地显示它而不删除任何行。 理想情况下,我想做的是让 init 接受一个额外的类。

// Create results
function init() {
    if (!needsInit)
        return;
    element = $("<div/>")
    .hide()
    .addClass(options.resultsClass)
    .css("position", "absolute")
    .appendTo(document.body);

    list = $("<ul/>").appendTo(element).mouseover( function(event) {
        if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
            active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
            $(target(event)).addClass(CLASSES.ACTIVE);            
        }
    }).click(function(event) {
        $(target(event)).addClass(CLASSES.ACTIVE);
        select();
        // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
        input.focus();
        return false;
    }).mousedown(function() {
        config.mouseDownOnSelect = true;
    }).mouseup(function() {
        config.mouseDownOnSelect = false;
    });

    if( options.width > 0 )
        element.css("width", options.width);

    needsInit = false;
} 

【问题讨论】:

  • 您需要添加的CSS类是否与用于生成结果的#elem对应?
  • 是的,如果我正确理解了您的要求,我想我会这样做。让我澄清一下 - 当自动完成完成时(即用户尚未搜索/键入),带有匹配项的 &lt;div&gt; 结果将附加到正文的末尾。要求是能够向生成的&lt;div&gt; 添加一个 CSS 类,以便以某种方式识别它。这是正确的吗?
  • 您能否更改 js 源代码,以便为您调用的每个 ac 准备好元素并使其在文档准备就绪时不可见?
  • 自动完成的结果如何被放入&lt;ul&gt;?我们可以看看代码吗?
  • 我是说你换插件!

标签: javascript jquery plugins autocomplete customization


【解决方案1】:

查看自动完成插件,传入的选项使用$.extend 与默认值合并。这是代码

autocomplete: function(urlOrData, options) {
        var isUrl = typeof urlOrData == "string";
        options = $.extend({}, $.Autocompleter.defaults, {
            url: isUrl ? urlOrData : null,
            data: isUrl ? null : urlOrData,
            delay: isUrl ? $.Autocompleter.defaults.delay : 10,
            max: options && !options.scroll ? 10 : 150
        }, options);

这里是默认值

$.Autocompleter.defaults = {
    inputClass: "ac_input",
    resultsClass: "ac_results",
    loadingClass: "ac_loading",
    minChars: 1,
    delay: 400,
    matchCase: false,
    matchSubset: true,
    matchContains: false,
    cacheLength: 10,
    max: 100,
    mustMatch: false,
    extraParams: {},
    selectFirst: true,
    formatItem: function(row) { return row[0]; },
    formatMatch: null,
    autoFill: false,
    width: 0,
    multiple: false,
    multipleSeparator: ", ",
    highlight: function(value, term) {
        return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
    },
    scroll: true,
    scrollHeight: 180
};

由于用于结果 &lt;div&gt; 的 CSS 类在默认值内不受保护,我们需要做的就是传入我们自己的 CSS 类以用于结果 &lt;div&gt;。类似于以下内容

var id = $("#elem1").attr('id');   
$("#elem1")
    .autocomplete("source1.php", {resultsClass: "ac_results " +id});

您只需要为每个自动完成设置在 resultsClass CSS 类中使用的适当 id。

【讨论】:

  • 关键是传入的options对象是在$.extend的最后添加的,也就是说这个对象中指定的属性会覆盖之前对象中的属性(即$.Autocompleter.defaults对象)
猜你喜欢
  • 2012-01-26
  • 2011-09-08
  • 2017-05-31
  • 2014-11-22
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多