DropKick选择图像

use*_*141 6 jquery html-select jquery-dropkick

我想创建一个包含图像而不是文本的下拉列表,我希望select标签可以完全自定义.

使用DropKick可以在下拉列表中使用图像而不是文本?

我尝试修改使用图像,但我希望能够在其他dropkick元素的同一页面上使用它作为文本.

在代码中:

我改变

optionTemplate = '<li class="{{ current }}"><a data-dk-dropdown-value="{{ value }}">{{ text }}</a></li>',
Run Code Online (Sandbox Code Playgroud)

optionTemplate = '<li class="{{ current }}"><img src="images//{{ value }}.png" /></li>',
Run Code Online (Sandbox Code Playgroud)

小智 5

这是使用HTML5的更好的解决方案data attributes.必须修改jquery.dropkick-1.0.0.js文件中写入的代码,如下所示(行号仅适用于v1.0.0):

// Line 39 -- Add "<img>"
// HTML template for the dropdowns
dropdownTemplate = [
  '<div class="dk_container" id="dk_container_{{ id }}" tabindex="{{ tabindex }}">',
    '<a class="dk_toggle">',
      '<span class="dk_label">{{ label }}<img src="{{ icon }}"/></span>', /* << */
    '</a>',
    '<div class="dk_options">',
      '<ul class="dk_options_inner">',
      '</ul>',
    '</div>',
  '</div>'
].join(''),

// Line 51 -- Add "<img>" (string broken down here for readability)
// HTML template for dropdown options
optionTemplate = '<li class="{{ current }}">' +
                 '<a data-dk-dropdown-value="{{ value }}">{{ text }}' +
                 '<img src="{{ icon }}"/></a></li>'; /* << */
Run Code Online (Sandbox Code Playgroud)

此外,将以下行添加到插件的选项中

  // Line 98 -- add "data.icon"
  // Don't do anything if we've already setup dropkick on this element
  if (data.id) {
    return $select;
  } else {
    data.settings  = settings;
    data.tabindex  = tabindex;
    data.id        = id;
    data.$original = $original;
    data.$select   = $select;
    data.value     = _notBlank($select.val()) || _notBlank($original.attr('value'));
    data.label     = $original.text();
    data.options   = $options;

    /* Add this attribute */
    data.icon      = $original.data('icon'); /* << */
  }
Run Code Online (Sandbox Code Playgroud)

_build函数内的以下行之前,

// Line 318
if (view.options && view.options.length) {
Run Code Online (Sandbox Code Playgroud)

添加以下行:

// Line 317. To be placed after other "template = template.replace" statements
template = template.replace('{{ icon }}', view.icon);
Run Code Online (Sandbox Code Playgroud)

最后,在循环之后

// Line 321
var // ...
  oTemplate = optionTemplate
;
Run Code Online (Sandbox Code Playgroud)

添加以下行

// To be placed after other "oTemplate = oTemplate.replace" statements
oTemplate = oTemplate.replace('{{ icon }}', view.icon);
Run Code Online (Sandbox Code Playgroud)

这可能不是最好的编码实践(monkeypatching),因为代码可能会在icon未设置data属性时中断.

我建议您添加一些代码来检查icon数据属性值的值,并创建两个模板:一个用于选项,另一个用于默认下拉列表.然后可以选择要使用的模板.这同样适用于所述_build的功能,如与的Monkeypatching这取决于view.icon值(如果它被定义或没有).


use*_*141 2

我找到了一个临时解决方案,我不知道它是否是最好的,但它现在有效:

DropKick 将选项标签替换为 li 标签,其中包含一个带有属性“data-dk-dropdown-value”的 a 标签。因此,使用 javascript,我将“a”值替换为“img”元素,并且 img 的 src 属性是选项的值(从“data-dk-dropdown-value”属性获取 if )。

这是一个例子:

channel = document.getElementById('dk_container_channels-menu').getElementsByTagName('div')[0].getElementsByTagName('ul')[0].getElementsByTagName('li').getElementsByTagName('a')[0].innerHTML = "<img src=\"images/channels/" + channel + ".png\">";
Run Code Online (Sandbox Code Playgroud)

如果您找到更好或更快的解决方案,请告诉我。

(注意:DropKick必须在替换元素之前初始化)