我正在制作一个简单的JavaScript增强列表。我希望它是一个输入列表,每个输入都有一个“添加”和“删除”按钮。如果用户点击“添加”,则会添加新的li
。如果用户点击“删除”,则会删除li
。
除了在<input>
中点击“输入”外,它工作正常。目前,它始终会导致Remove.click
事件处理程序触发,除非列表中只有一个项目。我不知道为什么。我怎么能抑制这个?
这是完整的jQuery。我修复“输入”问题的尝试已被注释掉,但它不起作用。我怀疑我可以更好地设计这个代码;如果你看到了改进,我很乐意听到它。
function make_smart_list(list)
{
var ADD_CLASS = 'foo-widget-Add';
var REMOVE_CLASS = 'foo-widget-Remove';
var jq_list = $(list);
jq_list.parents('form').submit(function() {
return false;
});
function refresh_handlers() {
jq_list.find(sprintf('.%s, .%s', REMOVE_CLASS, ADD_CLASS)).unbind('click');
// jq_list.find('input').unbind('submit');
//
// jq_list.find('input').submit(function() {
// var jq_this = $(this);
// var next_button = jq_this.nextAll('button');
// if (next_button.hasClass(ADD_CLASS)) {
// next_button.nextAll('button').click();
// return;
// }
//
// if (next_button.hasClass(REMOVE_CLASS)) {
// return false;
// }
//
// });
jq_list.find("." + REMOVE_CLASS).click(function() {
var jq_this = $(this);
jq_this.parent().remove();
refresh_handlers();
return false;
});
jq_list.find("." + ADD_CLASS).click(function() {
var jq_this = $(this);
if (jq_this.prevAll('input').val() == '') {
return;
}
jq_this.parent().clone().appendTo(jq_this.parent().parent());
jq_this.parent().next().find('input').val('').focus();
jq_this.removeClass(ADD_CLASS).addClass(REMOVE_CLASS);
jq_this.text('Remove');
refresh_handlers();
return false;
});
}
refresh_handlers();
}
(sprintf
是我的另一个脚本。)
更新:标记如下:
<ul id="id_bar" class="foo-widget-list">
<li><input value=""><button class="foo-widget-Remove">Remove</button></li>
<li><input value=""><button class="foo-widget-Add">Add</button></li>
</ul>
这是包含其他组件的表单的一部分,但我所关心的只是这一部分。
实际激活列表的脚本:
$(function() {
$.each($('.foo-widget-list'), function(index, item) {
make_smart_list(item)
});
});
更新2 :按如下方式设置keydown可以防止“删除”按钮输入问题:
jq_list.find('input').keydown(function(e) {
var next_button = $(this).nextAll('button');
if (e.keyCode == ENTER_KEYCODE && next_button.hasClass(REMOVE_CLASS)) {
return false;
}
但是,在通过“添加”按钮聚焦输入时按Enter键仍会导致remove.click
处理程序被触发。
});
答案 0 :(得分:2)
在keup docs中,它实际上有一个特定的例子来检测“输入”键的命中。这是一段摘录,稍加修改(希望)可以更容易地放入您的代码中:
$([element_selector]).keyup(function(event) {
if (event.keyCode == '13') {
event.preventDefault();
}
// other keyup code here
});
你会想把它放在你创建元素时放在元素上的处理程序中,但这个基本思想应该可以正常工作。
答案 1 :(得分:1)
这应该有效:
$('input').keydown(function(e) {
if (e.keyCode == 13) { return false; }
});
您只需跟踪ENTER键并在按下该事件时终止该事件。
请注意,submit()
方法仅用于<form>
元素,而不是其字段。
答案 2 :(得分:-1)
不需要jQuery。只需覆盖页面中所有表单的onsubmit
事件。
var inputs=document.all.tags('form')||document.getElementsByTagName('form');
for(x=0;x<inputs.length;x++){
inputs[x].onsubmit=function(){
return false;
}
}