【问题标题】:Selector to click on div loaded with AJAX - jQuery选择器单击加载了 AJAX 的 div - jQuery
【发布时间】:2015-09-25 10:57:24
【问题描述】:

我正在尝试创建一个事件,在单击 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>

然后我喜欢做的是选择我的 div ID: "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 吗?

【问题讨论】:

  • $('.dashboard_container').on("click", '.panel', function(){尝试一次

标签: javascript jquery html ajax jquery-ui


【解决方案1】:

你必须使用点击事件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;"="">

你必须修复它。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    尽管使用on(),您必须在动态创建的 DOM 元素上重新绑定事件。假设您有一个容器&lt;div id="foo"&gt;&lt;/div&gt;

    $(element).on('click', fn) 不影响动态创建的元素

    这会提醒'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);
    

    $(document).on('click', element, fn) 影响动态创建的元素

    因此,每次添加新元素时都必须重新绑定事件。如果性能不那么重要,您可以使用另一种语法,这样您就不需要重新绑定它们。 (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 上,并且每次单击元素时都会检查给定的选择器。这也是为什么它的性能更差的原因。

    【讨论】:

    • 感谢您对它的工作原理非常清晰的解释。这正是我需要的!
    【解决方案3】:

    你说过:

    点击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 警报(测试)。

    【讨论】:

    • 那不行,因为元素dashboard_container是用JS代码动态添加的。
    • 那是因为你测试的HTML不是JS生成的。
    • 看看我编辑的部分。 .find() 似乎可以使用动态 HTML :)
    • 这也有效,谢谢 :D @ Zakaria:也许我的 OP 中不清楚,但仪表板容器不是动态添加的。
    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多