【问题标题】:jquery color picker Spectrum not working on Internet explorerjquery 颜色选择器 Spectrum 在 Internet Explorer 上不起作用
【发布时间】:2015-12-08 03:12:56
【问题描述】:

我正在使用Spectrum 作为颜色选择器的 jquery 插件,以便在 contenteditable div 中使用它。在 chrome 和 firefox 中,它工作得很好。但在 Internet Explorer 中,它只是显示调色板,但当我选择时,什么都没有改变。

但是,如果我以这种方式直接执行execCommand,它就可以工作:

$('#btn-color_font').click(function() {
    document.execCommand('foreColor', false, "#ff0000");
});

我做错了什么?请帮助我如何在 IE 中使用它。谢谢。

jsfiddle

sn-p html:

<li class="main-btn">
    <a href="#" id="btn-color_font" class="wysiwyg-color-spectrum-cF">cF</a>
</li>
<li class="main-btn" >
    <a href="#" id="btn-color_background" class="wysiwyg-color-spectrum-bF">cB</a>
</li>

sn-p js:

$(".wysiwyg-color-spectrum-cF").spectrum({
    showPaletteOnly: true,
    togglePaletteOnly: true,
    togglePaletteMoreText: 'more',
    togglePaletteLessText: 'less',
    color: 'blanchedalmond',
    change: function (color) {
        document.execCommand('foreColor', false, color.toHexString());
    },
    hideAfterPaletteSelect: true,
    palette: [
        ["#000", "#444", "#666", "#999", "#ccc", "#eee", "#f3f3f3", "#fff"],
        ["#f00", "#f90", "#ff0", "#0f0", "#0ff", "#00f", "#90f", "#f0f"],
        ["#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#cfe2f3", "#d9d2e9", "#ead1dc"],
        ["#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#9fc5e8", "#b4a7d6", "#d5a6bd"],
        ["#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6fa8dc", "#8e7cc3", "#c27ba0"],
        ["#c00", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3d85c6", "#674ea7", "#a64d79"],
        ["#900", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#0b5394", "#351c75", "#741b47"],
        ["#600", "#783f04", "#7f6000", "#274e13", "#0c343d", "#073763", "#20124d", "#4c1130"]
    ]
});

【问题讨论】:

  • 为什么不使用这个:ajaxtoolkit.net/ColorPicker/ColorPicker.aspx???
  • 有趣的问题...只要在 IE 中点击一个颜色,文本选择就会消失——因此没有文本可以再更改了。请检查:stackoverflow.com/questions/12778508/…
  • @ÁlvaroG.Vicario 好的,我会调查的。谢谢。
  • @Stranger 很抱歉,但我认为这是一个完全不同的背景。
  • @Karl 我知道这是不同的,但只是作为一个使用简单的颜色选择器没有任何困难的建议。

标签: javascript jquery internet-explorer contenteditable


【解决方案1】:

这里的问题是 IE 在您单击颜色之前失去焦点/选择,这就是它不起作用的原因。它会触发change 事件,但由于没有选择任何内容,因此什么也没有发生。

作为一种解决方法,您必须在单击 Spectrum 按钮时保存选择,然后在触发 Spectrum 的 change 事件时恢复该选择。

类似的东西:

var WinSelection = (function(w, d) {
  var currentSelection = null; // create a variable to save the current selection

  function saveSelection() { // saveSelection copied from another SO answer
    if (w.getSelection) {
      sel = w.getSelection();
      if (sel.getRangeAt && sel.rangeCount) {
        return sel.getRangeAt(0);
      }
    } else if (d.selection && d.selection.createRange) {
      return d.selection.createRange();
    }
    return null;
  }

  function restoreSelection(range) { // restoreSelection copied from another SO answer
    if (range) {
      if (w.getSelection) {
        sel = w.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
      } else if (d.selection && range.select) {
        range.select();
      }
    }
  }

  return { // return an object with two public methods: saveSelection and restoreSelection
    saveSelection: function() {
      currentSelection = saveSelection();
    },
    restoreSelection: function() {
      restoreSelection(currentSelection);
    }
  };
})(window, document);

然后,在您的代码中,您可以在单击按钮时保存选择:

$('#wysiwyg-editor li a').click(function() {
  WinSelection.saveSelection();
});

在您的 change 事件中,您恢复选择:

/* ... */
change: function (color) {
  WinSelection.restoreSelection();
  document.execCommand('foreColor', false, color.toHexString());
},
/* ... */
change: function (color) {
  WinSelection.restoreSelection();
  document.execCommand("BackColor", false, color.toHexString());
},
/* ... */

这里是your fiddle - 已更新,可在 IE 中使用。

【讨论】:

  • 离开了一段时间。谢谢。
【解决方案2】:

想要提供另一个对我有用的解决方案:

将 html 属性 unselectable='on' 添加到将由频谱插件生成的这三个 div 中(我在站点完成加载后执行代码):

jQuery(".sp-replacer").attr("unselectable", "on");
jQuery(".sp-preview").attr("unselectable", "on");
jQuery(".sp-preview-inner").attr("unselectable", "on");

这可以防止失去对所选文本的关注。根据我的测试,这不应该影响其他浏览器的正常行为(在 Firefox、Chrome 和 Opera 上测试)。 编辑:简单的颜色选择有效,但如果我想选择预定义的颜色或在显示的输入字段中手动输入另一个值,选择仍然丢失。

【讨论】:

    【解决方案3】:

    您需要为 IE 添加专有过滤器以获得渐变支持

    结帐:http://bgrins.github.io/spectrum/#details-ieImplementation

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      相关资源
      最近更新 更多