0

尝试将一些用户输入从一个 HTML 复制input到另一个,我的控制台显示错误:Uncaught TypeError: Object #<HTMLInputElement> has no method 'val'

不知道问题是什么..我认为文本输入确实有价值?谢谢你的帮助!

HTML:

<input id="a" class="answer" type="text">
<input id="af" type="text" name="a">


$('.answer').bind('keypress', function(){
    var name  = $(this).attr('id'),
        feild = $('#' + name + 'f')[0];

    feild.val($(this).val());
});
4

2 回答 2

3

编辑:正如@zerkms 指出的那样,无论如何都不需要[0],但是由于有时将数组索引与选择器一起使用很有用,所以我将把它留在这里,以便您了解错误。

改变:

field.val($(this).val());

$(field).val($(this).val());

说明:$('#' + name + 'f')获取与选择器匹配的 HTML 元素数组。因为你把[0]它放在数组中的第一个 HTML 元素。由于field是 HTML 元素而不是 jQuery 对象,因此您需要将其转换为 jQuery 对象,$(field)以便在其上使用 jQuery 方法。

于 2012-05-23T01:49:26.190 回答
1

第一件事——需要添加几个额外的点才能真正完成这里的解决方案:

  • onkeypress 事件应该只在字符键按下和释放(或重复保持)时触发。

  • onkeydown/onkeyup 事件应该为任何被按下/释放的键触发。

参考

因此,您确实应该在 keyup 上复制输入文本,因为您想要包括删除操作、粘贴事件等。即使使用 @zerkms/@waitinfratrain 修复,您也只能将信息添加到第二个框。

第二件事——这种方法有效,但它没有我在实际站点中看到的那种活泼,我想看看我能不能得到它,所以就这样吧。

Onkeyup/down 事件没有字符信息(或不应该),因此您不能真正使用它们来帮助加快进程。

我摆弄了(呵呵)一段时间,我想出的响应时间明显更快,尽管它确实增加了一个依赖项—— jcaret

我不认为有任何重大错误,但 YMMV。浏览器对按键事件的支持也非常不完整,但希望jQuery可以为您处理(我只在 Chrome 中测试过)。

$('.answer').bind('keyup', function(e){
    $('#' + $(this).attr('id') + 'f').val($(this).val());
});

$('.answer').keypress(function(e){
    var newChar = String.fromCharCode(event.which);
    var oldVal = $(this).val();
    var cursorPos = $(this).caret().start;

    var newVal = oldVal.slice(0, cursorPos) + newChar + oldVal.slice(cursorPos);

    $('#' + $(this).attr('id') + 'f').val(newVal);
});

jsfiddle

希望这可以帮助!​</p>

于 2012-05-23T04:41:37.337 回答