JQuery on() 具有动态创建的字段和多个选择器
JQuery on() with dynamically created fields and multiple selector
1000 个这样的问题,但我找不到我要找的东西;我会尽量准确。我对 JS/JQuery 有相当多的经验,但我对这种事情迷路了。
所以我正在动态创建输入,然后将其移入 div 以供使用。我想为这些输入附加一个事件处理程序,以便在它们发生变化时发生某些事情,这取决于知道哪个输入已被更改。 HTML 的基本形式如下所示:
<div class='inputBucket' hidden>
<input><input> <!-- etc -->
</div>
<div class='inputBox'></div>
我使用的 JS 看起来像这样:
$('body').on(
"input",
'.inputBox input[type!="radio"][type!="checkbox"]',
function(){
$action($(this));
}
);
$action 是一个函数,旨在完成所有繁重的工作。
我遇到的问题是 "this" 不是我期望的元素。它 returns 是第一个使用的输入,即使它已经移回 .inputBucket div。触发器总是在预期时触发,但在页面加载后使用第一个输入,而不是实际更改的输入。
正在寻找任何方法来实现所需的功能,但不确定哪里出了问题不知道要更改什么!这也是我实际尝试创建的精简版本,如果这可行,我会提供更多信息。
解释第2轮
因此,使用 JQueryUI 可拖动功能,.inputBucket 中的输入已被拖动到那里。然后这些是可排序的(.inputBucket 已经应用了可排序的 JQueryUI 函数,输入是隐藏的,但它们在 divs 内,这显然是可见的)。最后一步是当 .inputBucket 中的 div 之一被点击时,它会将其输入 div 发送到 .inputBox,在那里它们被更改,我得到了我的问题
还有一些...
认为这可能是不工作的另一个原因。我想创建一个函数来处理事件中的所有异常情况,如果这是正确的,它也可能对其他人有用! 我已经更新了这个功能,现在可以使用了
$.fn.onInput = function ($selector, $actionOrMod, $action) {
if (arguments.length == 2){
$mod = "";
$action = $actionOrMod;
}else if(arguments.length == 3){
$mod = $actionOrMod;
}else{
console.error('Incorrect number of arguments');
return;
}
$(this).on(
"input",
$selector + ' textarea' + $mod,
$.debounce(function(evt){$action($(evt.target))}, 250)
);
$(this).on(
"input",
$selector + ' input[type!="radio"][type!="checkbox"]' + $mod,
$.debounce(function(evt){$action($(evt.target))}, 250)
);
$(this).on(
"submit",
$selector + ' input[type!="radio"][type!="checkbox"]' + $mod,
function(evt){$action($(evt.target))}
);
$(this).on(
"change submit",
$selector + ' input[type="radio"]' + $mod + ', ' + $selector + ' input[type="checkbox"]' + $mod + ', ' + $selector + ' select' + $mod,
function(evt){$action($(evt.target))}
);
}
我试过简单地将 $action 作为 on 参数传递,或者编写一个小函数将 "this" 传递给 action,这两种方式都显示了这个问题。这里有什么错误吗? $.debounce 是我知道并经常使用的 JQuery 插件,应该不是问题所在。
我不确定你的要求,但如果我没有错,你可以通过向所有动态添加的输入添加一个通用 class 来完成,并使用下面给出的代码,事件附加所有这些元素
$(body).on('input', '.myCommonClass', function () {
var self=$(this);
// so on.....
});
你可以试试 function(evt){ $action(evt.target){..}}
看看会发生什么吗?
根据我的基本理解,jquery 中的 this
被操纵,因此它绑定到事件发生的 object/element(否则它将指的是 window object) 但是因为你委托事件你没有得到预期的元素,event.target 确保你得到接收事件的元素,就像你说的那样
$('body').on('click', 'li', function(evt){ console.log(evt.target)});
您将获得收到点击的精确 li 元素
1000 个这样的问题,但我找不到我要找的东西;我会尽量准确。我对 JS/JQuery 有相当多的经验,但我对这种事情迷路了。
所以我正在动态创建输入,然后将其移入 div 以供使用。我想为这些输入附加一个事件处理程序,以便在它们发生变化时发生某些事情,这取决于知道哪个输入已被更改。 HTML 的基本形式如下所示:
<div class='inputBucket' hidden>
<input><input> <!-- etc -->
</div>
<div class='inputBox'></div>
我使用的 JS 看起来像这样:
$('body').on(
"input",
'.inputBox input[type!="radio"][type!="checkbox"]',
function(){
$action($(this));
}
);
$action 是一个函数,旨在完成所有繁重的工作。
我遇到的问题是 "this" 不是我期望的元素。它 returns 是第一个使用的输入,即使它已经移回 .inputBucket div。触发器总是在预期时触发,但在页面加载后使用第一个输入,而不是实际更改的输入。
正在寻找任何方法来实现所需的功能,但不确定哪里出了问题不知道要更改什么!这也是我实际尝试创建的精简版本,如果这可行,我会提供更多信息。
解释第2轮
因此,使用 JQueryUI 可拖动功能,.inputBucket 中的输入已被拖动到那里。然后这些是可排序的(.inputBucket 已经应用了可排序的 JQueryUI 函数,输入是隐藏的,但它们在 divs 内,这显然是可见的)。最后一步是当 .inputBucket 中的 div 之一被点击时,它会将其输入 div 发送到 .inputBox,在那里它们被更改,我得到了我的问题
还有一些... 认为这可能是不工作的另一个原因。我想创建一个函数来处理事件中的所有异常情况,如果这是正确的,它也可能对其他人有用! 我已经更新了这个功能,现在可以使用了
$.fn.onInput = function ($selector, $actionOrMod, $action) {
if (arguments.length == 2){
$mod = "";
$action = $actionOrMod;
}else if(arguments.length == 3){
$mod = $actionOrMod;
}else{
console.error('Incorrect number of arguments');
return;
}
$(this).on(
"input",
$selector + ' textarea' + $mod,
$.debounce(function(evt){$action($(evt.target))}, 250)
);
$(this).on(
"input",
$selector + ' input[type!="radio"][type!="checkbox"]' + $mod,
$.debounce(function(evt){$action($(evt.target))}, 250)
);
$(this).on(
"submit",
$selector + ' input[type!="radio"][type!="checkbox"]' + $mod,
function(evt){$action($(evt.target))}
);
$(this).on(
"change submit",
$selector + ' input[type="radio"]' + $mod + ', ' + $selector + ' input[type="checkbox"]' + $mod + ', ' + $selector + ' select' + $mod,
function(evt){$action($(evt.target))}
);
}
我试过简单地将 $action 作为 on 参数传递,或者编写一个小函数将 "this" 传递给 action,这两种方式都显示了这个问题。这里有什么错误吗? $.debounce 是我知道并经常使用的 JQuery 插件,应该不是问题所在。
我不确定你的要求,但如果我没有错,你可以通过向所有动态添加的输入添加一个通用 class 来完成,并使用下面给出的代码,事件附加所有这些元素
$(body).on('input', '.myCommonClass', function () {
var self=$(this);
// so on.....
});
你可以试试 function(evt){ $action(evt.target){..}}
看看会发生什么吗?
根据我的基本理解,jquery 中的 this
被操纵,因此它绑定到事件发生的 object/element(否则它将指的是 window object) 但是因为你委托事件你没有得到预期的元素,event.target 确保你得到接收事件的元素,就像你说的那样
$('body').on('click', 'li', function(evt){ console.log(evt.target)});
您将获得收到点击的精确 li 元素