【问题标题】:jQuery val() not working with Caret logic in ChromejQuery val() 不适用于 Chrome 中的插入符号逻辑
【发布时间】:2011-05-27 06:12:21
【问题描述】:

我正在使用已映射 keyCodes 的输入字段,以便键盘输入将不同的语言字符呈现到输入字段中。

当字符到达输入“视图”的末尾时,使用 jQuery val() 方法的“映射”字符的任何附加输入都不会被解释为来自浏览器的键输入,因此保留最后一个输入的字符始终可见。

所以我必须添加插入符号逻辑(jsfiddle 中的底部输入使用插入符号逻辑)但这在 Chrome/(webkit?) 上不起作用

这是我的示例的 jsfiddle。 http://jsfiddle.net/dwickwire/S9EKN/

编辑:我测试了以下版本,适用于 FF,但不适用于我的 Chrome

Mac Snow Leapord OSX 10.6.7

Chrome:v 11.0.696.68、v 11.0.696.71 - 不工作

Firefox:4.0.1 - 工作

Windows Chrome:-v 不确定 - 不起作用

我不确定如何解决这个问题,有什么想法吗? 谢谢

【问题讨论】:

  • 它适用于我的 Chrome... v 11.0.696.68
  • @Fosco 你确定你测试正确吗?为了正确测试,我在这里使用了很多行话:P 我已经在 Windows 和 Mac 上使用 Chrome 在多台计算机上对其进行了测试,并验证了我的示例不起作用。
  • @Pointy Safari 也不起作用 -v 5.0.5
  • 它不适用于我在 Firefox Chrome 中的 Linux 上。
  • 我在 Windows 上使用 Chrome 11

标签: javascript jquery google-chrome caret


【解决方案1】:

如果您保存并添加到输入的scrollLeft 位置,它将更新并保持输入的字符在视图中。但是,如果您在输入的中间单击并开始输入,它会失败。

我用下面的代码更新了第二个输入 demo。另请注意,添加的输入和测试范围应具有相同的字体大小。

input_2.bind('keydown.keyboard', function(e) {
    var key = "",
        current_val = input_2.val(),
        pos = input_2.caret(),
        start_pos = pos.start,
        end_pos = pos.end,
        scroll = $(this).scrollLeft();

    // some mapped keys
    switch (e.which) {
        // e key
    case 69:
        key = "ε";
        e.preventDefault();
        break;
        // f key            
    case 70:
        key = "φ";
        e.preventDefault();
        break;
        // z key                
    case 90:
        key = "ζ";
        e.preventDefault();
        break;
        // a key
    case 65:
        key = "α";
        e.preventDefault();
        break;
    }

    if (key !== '') {
        var test = $('<span class="test">&nbsp;' + key + '</span>').appendTo('body');
        scroll += test.width();
        test.remove();
    }

    input_2.val(current_val + key);
    //Insert/Replace text at caret then restore caret        
    input_2.value = current_val.substr(0, start_pos) + key + current_val.substr(end_pos, current_val.length);
    input_2.caret(start_pos + key.length, start_pos + key.length);
    if (key !== '') {
        $(this).scrollLeft(scroll);
    }

});

更新:scrollLeft 位置似乎有点偏离,所以如果你在字符的范围内添加一个&amp;nbsp;,效果会更好 (updated demo)

【讨论】:

  • 虽然它确实有效,但感觉有点不可预测,(即样式和 DOM 结构总是不同的),我希望有一个解决方案,我不必添加 dom 节点和计算字体宽度,因为动态可能会因站点而异。
  • 好的。因此,使用您的 scrollLeft 想法,我设法通过计算输入中 fontSize 的宽度使其更具动态性。这是工作链接... jsfiddle.net/dwickwire/S9EKN/25 非常感谢!测试 Chrome -v 11.0.696.71 FF 4.0.1, Safari 5.0.5, IE6, IE9, IE9 comp mode for IE7 都可以工作。
猜你喜欢
  • 2020-11-17
  • 2014-02-19
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2015-09-06
相关资源
最近更新 更多