我有两个类似的函数,完成函数和删除函数。
我想把它们合并在一起,但我不知道如何正确地合并它们。我在php的后端做了,但对于javascript,不知怎么的,我不能让它工作。
我为这两个按钮设置了jquery比方说
我从这样的东西开始,它工作得很好,没有任何问题,但我想把它们合并在一起会很好,因为它们非常相似。
$('ol#textField').on('click', '.done-btn', doneButton);
$('ol#textField').on('click', '.delete-btn', deleteButton);
my deleteButton and donebutton函数
function deleteButton(e){
e.preventDefault();
var $clicked = $(this);
var $cLI = $clicked.closest('li');
var todoText = $cLI.clone().children().remove().end().text();
var getID = $cLI.attr('id');
$.ajax({
// codes
}
});
}
function doneButton(e){
e.preventDefault();
var $clicked = $(this);
var $cLI = $clicked.closest('li');
var $cSpan = $clicked.closest('span');
var todoText = $cLI.clone().children().remove().end().text();
var getID = $cLI.attr('id');
$.ajax({
//codes
}
});
}
它们看起来是一样的,但当然除了ajax部分,我没有添加,因为它会有太多的代码,我不认为这些代码是任何问题。
所以我尝试了像这样的东西来组合它们,但是不起作用。
$('ol#textField').on('click', '.done-btn', doubleD('done'));
$('ol#textField').on('click', '.delete-btn', doubleD('delete'));
我试着像这样组合函数。如果参数是done那么done ajax就会被调用参数是delete那么delete就会被调用。我还想将.preventDefault()
添加到函数中,但不知道如何完成它们。
function doubleD(action){
var $clicked = $(this);
var $cLI = $clicked.closest('li');
var todoText = $cLI.clone().children().remove().end().text();
var getID = $cLI.attr('id');
if(action == 'done'){
var $cSpan = $clicked.closest('span');
$.ajax({
// ajax for done
}
});
}
if(action == 'delete'){
$.ajax({
// ajax for delete
}
});
}
}
有人能帮我一下吗?感谢您的宝贵时间。
问题是jQuery不会将你的参数传递给处理程序。你必须把它添加为事件数据。参考:http://api.jquery.com/on/
试试这个:
$('ol#textField').on('click', '.done-btn', { action: 'done' }, doubleD);
$('ol#textField').on('click', '.delete-btn', { action: 'delete' }, doubleD);
然后像这样访问:
function doubleD(evt){
var action = evt.data.action; // ACCESS THE PARAMETER HERE
var $clicked = $(this);
var $cLI = $clicked.closest('li');
var todoText = $cLI.clone().children().remove().end().text();
var getID = $cLI.attr('id');
if(action == 'done'){
var $cSpan = $clicked.closest('span');
$.ajax({
// ajax for done
}
});
}
if(action == 'delete'){
$.ajax({
// ajax for delete
}
});
}
}
我不建议这样做,但你也可以这样写:
$('ol#textField').on('click', '.done-btn', function () {
doubleD('done');
});
$('ol#textField').on('click', '.done-btn', function () {
doubleD('delete');
});
那么,您原来的doubleD
函数将工作。
你试过吗
$('ol#textField').on('click', '.done-btn, .delete-btn', function(e){
e.preventDefault();
if( $(this).hasClass('done-btn') ){
}else{
}
});
如果不是$(this)
,你可以使用$(e.target)
我也很确定,检查类会告诉你按钮,不是吗?
分隔调用,主要区别在于调用的范围。当它是事件的一部分时,$(this)
便具有意义,如果它是独立的,那么你便失去了作用域。为了克服这个问题,你可以使用包含事件http://www.w3schools.com/jquery/event_target.asp的target
的事件对象,你必须记住事件冒泡,但我认为在这种情况下(使用输入)你会没事的,如果你真的想要安全,你可以检查$(e.target).is('input[type="button"]')
。总之:
$('ol#textField').on('click', '.done-btn, .delete-btn', doubleD);
function doubleD(e){
e.preventDefault();
if( $(e.target).hasClass('done-btn') ){
}else{
}
};
然而,正如我在注释中所说,将逻辑从表示中分离出来(使用e.data)具有很大的价值。这意味着您不依赖于类名来实现逻辑。因此,如果您决定更改类,则不需要更新代码,因为它不依赖于您的表示(页面布局和样式)。
我实际上知道另一个答案,并计划添加它,但由于我不经常使用它,我不得不做一些谷歌搜索,以确保我记住它是正确的。另一张海报抢先了我一步。这很好,但我想指出这实际上是一个更好的方法。
也可以使用data-
http://www.w3schools.com/tags/att_global_data.asp属性代替类,如
<input type="button" class="done-btn" data-mode="done" />
检查
if( $(this).data('mode') == 'done' ){
...
有些人可能会说这不是"最佳实践"的方式,所以最好的方式,仍然是使用event.data
。因为虽然它在表示上没有那么宽松,但仍然存在依赖于DOM元素的元素。