如何获取在一系列事件中启动事件的元素
How to get the element which initiated the event in a series of events?
实际上会有两个问题,
场景是
表单包含三个提交按钮,当我单击其中一个按钮时,会触发提交事件,然后click
第一个事件,但我没有捕获它。第二个事件是表单的submit
这是我正在捕获的事件。
代码是
$('#search-main a').on('click', function(e){
e.preventDefault();
$('#search-advanced').remove();
var target = $(this).attr('href');
var res = $.get(target, function(data){
$('body').append($(data).find('#search-advanced'));
$('#search-advanced').addClass('row reveal-modal');
$('#search-advanced')
.css('top', 80)
.css('border-radius' , '5px')
.css('padding-left' , '0px')
.css('padding-right' , '0px');
$('#search-advanced').on('submit', 'form' ,function(e){
var params = $('#search-advanced form').serialize();
console.log(e);
console.log(params);
$.get(target, params, function(data){
$('#search-advanced form').html($(data).find('#search-advanced form').html());
$('#search-advanced input[name="select_filter"]').remove();
});
return false;
});
$('#search-advanced input[name="select_filter"]').remove();
$('#search-advanced').on('change', '#categoryDropdown', function(){
$('#search-advanced form').trigger('submit');
});
$('#search-advanced').append('<a class="close-reveal-modal">×</a>');
$('#search-advanced').reveal({
animation: 'fade',
closeOnBackgroundClick: false
});
});
});
由于 JQuery 文档说
只有"成功的控件"才会序列化为字符串。不提交 按钮值已序列化,因为表单未使用 按钮
我无法使用serialize()
获取按钮值
问题一是
如何获取启动提交的按钮属性?
我以不同的方式处理作为解决方法,即
- 首先捕获点击事件
- 获取属性
- 将属性作为事件额外参数传递
修改后的代码是
$('#search-advanced').on('submit', 'form' ,function(e){
var params = $('#search-advanced form').serialize();
console.log(e.data);
console.log(params);
$.get(target, params, function(data){
$('#search-advanced form').html($(data).find('#search-advanced form').html());
$('#search-advanced input[name="select_filter"]').remove();
if(typeof $('input[name="one_more"]') !== 'undefined'){
var oldOneButton = $('input[name="one_more"]');
var newOneButton = oldOneButton.clone();
newOneButton.attr('type', 'button');
newOneButton.insertBefore(oldOneButton);
oldOneButton.remove();
}
if(typeof $('input[name="remove_filter"]').attr('name') !== 'undefined'){
var oldRemoveButton = $('input[name="remove_filter"]');
var newRemoveButton = oldRemoveButton.clone();
newRemoveButton.attr('type', 'button');
newRemoveButton.insertBefore(oldRemoveButton);
oldRemoveButton.remove();
}
});
return false;
});
$('#search-advanced input[name="select_filter"]').remove();
$('#search-advanced').on('change', '#categoryDropdown', function(){
$('#search-advanced form').trigger('submit');
});
$('#search-advanced').on('click', 'input[name="one_more"]', function(){
console.log($(this).attr('name'));
var name = $(this).attr('name');
var value = $(this).attr('value');
$('#search-advanced form').trigger('submit', {name:value});
});
我更改了 type 属性,因为它触发了两次提交。
问题是console.log(e.data);
打印undefined
而不是传递的对象。
第二个问题是
为什么
e.data
undefined
?
任何建议将不胜感激。
要捕获按钮,请摆弄
$("#frm").on("click","button",function(){
alert(this.id);
}).on("submit",function(e){
console.log("submit");
return false;
});
工作解决方案包含两个问题的答案
$('#search-main a').on('click', function(e){
e.preventDefault();
$('#search-advanced').remove();
var target = $(this).attr('href');
var res = $.get(target, function(data){
$('body').append($(data).find('#search-advanced'));
$('#search-advanced').addClass('row reveal-modal');
$('#search-advanced')
.css('top', 80)
.css('border-radius' , '5px')
.css('padding-left' , '0px')
.css('padding-right' , '0px');
var clickedButtonName;
var clickedButtonVal;
$('#search-advanced input[name="select_filter"]').remove();
$('#search-advanced').on('change','#categoryDropdown', function(){
$('#search-advanced form').trigger('submit', {'select_filter':'Select Filter'});
}).on('click', 'input.button', function(){
clickedButtonName = $(this).attr('name');
clickedButtonVal = $(this).attr('value');
}).on('submit', 'form' ,function(e, attr){
var params = $('#search-advanced form').serialize();
if(typeof attr !== 'undefined'){
var key = Object.keys(attr);
params += '&'
+ key[0]
+ '='
+ attr[key[0]];
}
if(typeof clickedButtonName !== 'undefined' && typeof clickedButtonVal !== 'undefined'){
params += '&'
+ clickedButtonName
+ '='
+ clickedButtonVal;
}
$.get(target, params, function(data){
$('#search-advanced form').html($(data).find('#search-advanced form').html());
$('#search-advanced input[name="select_filter"]').remove();
});
return false;
});
$('#search-advanced').append('<a class="close-reveal-modal">×</a>');
$('#search-advanced').reveal({
animation: 'fade',
closeOnBackgroundClick: false
});
});
});
相关文章:
- 从控制器返回后Ajax启动事件激发
- window.on.scroll事件未启动
- 如何在所有ng点击事件AngularJS上启动一个方法
- 触摸启动事件未在iframe iOS 6中启动
- 事件侦听器未在chrome扩展中的options.js中启动
- 模型更改事件不会启动
- 为什么不'我的窗口滚动事件根本没有启动.其他答案没有解决问题
- 点击启动弹出事件未显示
- Ember视图未响应用户启动的事件
- 无线电输入更改的jQuery事件未启动
- Javascript onclick事件在第一次单击时未启动
- jQuery事件侦听器多次启动
- 一次点击,两次'单击'事件已启动
- Javascript onClick事件未启动
- 点击事件启动,但ajax未发生
- ajax,用两个事件启动函数
- 为什么不是't我的更改事件启动
- 我应该在等待事件启动时明确创建一个承诺吗
- 引导程序3:当类的点击事件启动时,popover最初不会出现
- JQuery UI对话框从输入焦点事件启动时不会关闭