[英]Selector to click on div loaded with AJAX - jQuery
我正在尝试创建一个事件,在单击div-wrapper时,从标记中获取数据值。 要在document.ready上不存在的元素上绑定事件,我必须使用“on-selector”吗?
在文档准备好我的HTML是:
<div class="dashboard_container">
<div class="ab-builder-el el-empty ui-droppable" ordering="-0.5">
<p>Plaats hier je element</p>
</div>
</div>
在拖放时,我使用jQuery在上面提到的div下面添加一部分HTML(使用类el-empty):
$(document).ready(function(){
//Initialize variables
var generatedID = 1;
var elementName = null;
//Initialize droppable elements
dropInit();
//Draggable
$('.ab-nav-element').draggable({
appendTo: '.scroll-container',
revert: 'invalid',
cursor: "move",
distance: 50,
revertDuration: 250,
helper: 'clone',
start: function(){
$('.el-empty').addClass('el-receptive');
elementName = $(this).data('original-title');
// console.log("draggable start, elementName: "+elementName);
},
stop: function(){
$('.el-receptive').removeClass('el-receptive');
elementName = null;
}
});
//Function droppable
function dropInit () {
// console.log("droppable start, elementName: "+elementName);
$('.ab-builder-el').droppable({
hoverClass : 'ui-hover',
drop: function() {
var dropContent = '<div id="'+elementName+'-'+generatedID+'" ordering="0" class="ab-builder-el panel" data-element="'+elementName+'"></div><div class="ab-builder-el el-empty" ordering="0.5"><p>Plaats hier je element</p></div>';
$(this).after(dropContent);
var divID = '#'+ $(this).next('.panel').attr('id');
generatedID++;
$(divID).load("builder-loader.php",{
elementName: elementName,
divID:divID
});
dropInit();
}
})};
});
AJAX调用将HTML更改为:
<div class="dashboard_container">
<div class="ab-builder-el el-empty ui-droppable" ordering="-0.5">
<p>Plaats hier je element</p>
</div>
<div id="element_text_columns-1" ordering="0" class="ab-builder-el panel ui-droppable" data-element="element_text_columns"><div class="row" background-color:default_background_color;"="">
<div class="ab-builder-el el-empty ui-droppable" ordering="0.5">
<p>Plaats hier je element</p>
</div>
</div>
我接下来要做的是选择带有ID的div:“element_text_columns-1”“并读出数据元素值。
我尝试使用很多选择器,但它们似乎都不起作用? 我有以下内容:
$('.dashboard_container').children('.panel').on("click", function(){
console.log('children');
var clickedElement = $(this).data('element');
if(typeof clickedElement != 'undefined'){console.log(clickedElement);}
});
但这似乎根本不起作用。 任何方法来瞄准div?
尽管使用on()
你必须在动态创建的DOM元素上重新绑定事件。 假设你有一个容器<div id="foo"></div>
。
这将警告'bar',因为它在添加元素后绑定。 ( JSFiddle )
var panel = $('<div class="panel">foo</div>');
$('#foo').append(panel);
$('.panel').on('click', function(){
alert('bar');
});
这不会提醒任何事情,因为您绑定事件,然后添加元素。 ( JSFiddle )
$('.panel').on('click', function(){
alert('bar');
});
var panel = $('<div class="panel">foo</div>');
$('#foo').append(panel);
因此,每次添加新元素时都必须重新绑定事件。 如果性能无关紧要,可以使用其他语法,这样就不需要重新绑定它们了。 ( JSFiddle )
$(document).on('click', '.panel', function(){
alert('bar');
});
var panel = $('<div class="panel">foo</div>');
$('#foo').append(panel);
$(document).on('click', '.dashboard_container .panel', function(){
var clickedElement = $(this).data('element');
if(typeof clickedElement != 'undefined'){console.log(clickedElement);}
});
注意 :文档只能替换为父div。 这是有效的,因为click事件是绑定在现有的父div上,每次单击该元素时都会检查给定的选择器。 这也是为什么表现更差的原因。
您必须on()
使用click事件on()
因为要选择的标记是使用js动态生成的(如注释中提到的Satpal ),然后是简单的选择器,如$(this).data( "element")
。
$('.dashboard_container').on("click", '.panel', function(){ alert($(this).data( "element")); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="dashboard_container"> <div class="ab-builder-el el-empty ui-droppable" ordering="-0.5"> <p>Plaats hier je element</p> </div> <div id="element_text_columns-1" ordering="0" class="ab-builder-el panel ui-droppable" data-element="element_text_columns"><div class="row" background-color:default_background_color;"=""> <div class="ab-builder-el el-empty ui-droppable" ordering="0.5"> <p>Plaats hier je element</p> </div> </div>
注意:您在ajax生成的HTML中有一个格式错误的标记:
<div class="row" background-color:default_background_color;"="">
你必须解决它。
希望这可以帮助。
你之前这么说:
单击div-wrapper ,从标记中获取数据值
所以,我认为你想要的是将click
事件分配给包装器,然后获取其后代的值。 为此,我们使用:
$('.dashboard_container').click(function(){
var data = $(this).find('.panel').data('element');
alert(data);
});
为了证明上面的代码适用于动态HTML,我在这里发布我测试过的代码。
HTML
<div id="foo"></div>
使用Javascript
$(function(){
$('#foo').click(function(){
var className = $(this).find('.panel').data('element');
alert(className);
});
var panel = $('<div class="panel" data-element="test">foo</div>');
$('#foo').append(panel);
});
结果 :当我单击div时,我得到data-element
警报(测试)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.