2

我在一个项目中使用 Jquery 多选。我遇到的问题是特殊字符在选择时不能很好地呈现。例如,在我的选择列表中,我有值“Anadarko E&P”,当我选择这个值时,它显示为“Anadarko E&P”。 在此处输入图像描述

有人知道如何防止这种情况吗?感谢期待

4

3 回答 3

1

我让它工作。找到下面的代码:

          $j(selector).multiselect({
        header: true,
        multiple: false,        
        selectedList: 1,
        classes: "jq_over",
        selectedText: function(numChecked, numTotal, checkedItems){
          for(var i = 0; i < checkedItems.length; i++){
            return $j(checkedItems[i]).siblings().text();
          }
       }
    }).multiselectfilter();

我必须修改 selectedText 属性以获取标签,这可以正常工作

于 2014-05-28T11:54:48.783 回答
0

我今天遇到了同样的问题,我找到了另一个我认为更好的解决方案,我将其发布在这里以备将来使用:

var multiSelect = $("#myField").multiselect({selectedList: 3});
multiSelect.multiselectfilter({autoreset: true});
multiSelect.data("echMultiselect")._setButtonValue = function(value){
    this.buttonlabel.html(value);
}

该问题已在此处讨论,但未修复以避免 XSS 漏洞,完整的官方答案是:

无处不在的 HTML 使代码更容易受到 XSS 漏洞的影响。最初的开发人员故意将其设置为使默认行为安全,如果您需要不安全的行为,则可以覆盖该方法并添加 html。在文档的自定义部分中有关于如何执行此操作的文档。

由于这个问题被打开,上面描述的行实际上也从 html() 更改为 text() 。

无论如何,在我的场景中,我想我可以忽略这种问题,因为我的<option>元素不能被用户修改。

注意,jquery.multiselect.js中的原始实现是:

// this exists as a separate method so that the developer
// can easily override it.
_setButtonValue: function(value) {
  this.buttonlabel.text(value);
},

并且明确指定可以很容易地覆盖。

PS:它适用于任何selectedList属性选项。

于 2017-03-17T10:18:54.563 回答
0

仅当 selectedList = 1 时才有效。对于其他情况(例如 selectedList = 4),我修改如下,

selectedText: function(numChecked, numTotal, checkedItems){
    var selectedList = 4;
    if(checkedItems.length > selectedList)
    {
        return checkedItems.length + " selected";
    }
    else
    {
        var selectedTextArr = [];
        for(var i = 0; i < checkedItems.length; i++)
        {
            selectedTextArr.push($(checkedItems[i]).siblings().text());
        }
        return selectedTextArr.join(', ').replace(/&amp;/g, "&").replace(/&gt;/g, ">").replace(/&lt;/g, "<");
    }
}

但是,要从根本上解决问题,修改 jquery.multiselect.js 可能是一种方法......

  if(numChecked === 0) {
    value = o.noneSelectedText;
  } else {
    if($.isFunction(o.selectedText)) {
      value = o.selectedText.call(this, numChecked, $inputs.length, $checked.get());
    } else if(/\d/.test(o.selectedList) && o.selectedList > 0 && numChecked <= o.selectedList) {
      value = $checked.map(function() { return $(this).next().html(); }).get().join(', ');
    } else {
      value = o.selectedText.replace('#', numChecked).replace('#', $inputs.length);
    }
    value = value..replace(/&amp;/g, "&").replace(/&gt;/g, ">").replace(/&lt;/g, "<");  // newly added
  }
于 2016-03-14T06:34:13.600 回答