追加后Jquery选择器不起作用

Posted

技术标签:

【中文标题】追加后Jquery选择器不起作用【英文标题】:Jquery selector not working after append 【发布时间】:2014-01-05 15:58:06 【问题描述】:

我有一个我调用的 php 脚本,它以一种可以直接插入容器或主体并正常工作的方式返回 html(E.X.'<image id="trolleyLogoEdge" class="pictureFrame party" src="tipsyTrixy.png" >')。将此文本附加到 div 后,选择器 $('#pictureFrame > img:first') 将不起作用。我没有使用事件处理程序或任何东西,所以我不知道我为什么会遇到问题。我的代码在div 中没有任何操作就可以正常工作,所以我假设它一定是选择器问题。在我决定动态填充 div 之前,我已经测试了我的 php 输出,它与 div 中的 html 完全匹配。

        var classType = '';
        var classTypePrev = '';
        var width = $(window).width();
        var height = $(window).height();

        var size = (height + width)/2;
        var time = 0;
        $( document ).ready(function()
        

            $.post( "pictureDirectory.php", function( data ) 
            
                $('#picureFrame').append(data);
                startSlideshow($('#pictureFrame > img:first'));
            );

        );
        window.onresize = function() 
        
            width = $(window).width();
        ;
        function startSlideshow(myobj) 
        


            classType = $(myobj).attr('class').split(' ')[1];
            if(classTypePrev != classType)
            
                $('.picDescription').animate('opacity': "0",duration: 2000,complete: function() );
                $('.picDescription.' + classType).animate('opacity': "1",duration: 3000,complete: function() );
            
            classTypePrev = classType;
            myobj.animate(left: "-=" + ((width/2)+ ($(myobj).width()/2) - 150), opacity: '1',
                duration: 5000,
                'easing': 'easeInOutCubic',
                complete: function() ).delay(2000).animate(left: "-=" + ((width/2)+ ($(myobj).width()/2) + 150), opacity: '0',
                    duration: 5000,
                    'easing': 'easeInOutCubic',
                    complete: function() 
                    
                        $(myobj).css("left", "100%");
                    
            );
            setTimeout(function()
            
                var next = $(myobj).next();
                if (!next.length) 
                
                    next = myobj.siblings().first();
                
                startSlideshow(next),9000);  
            

【问题讨论】:

你不应该在同一个页面上与一个 ID 和一个类同名。由于 img 具有 pictureFrame 类,而您在选择器中正在查看 ID 为 pictureFrame 的元素。 结果:$('#pictureFrame > img').length ???顺便说一句,我猜你的标记不完全一样,你应该提供一个样本 我有不同类别的图像。所有图片都具有用于 css 目的的类图片框架和用于其类别的附加类。 .length() 告诉我它是否是最后一个兄弟,所以我可以重新开始循环。 【参考方案1】:

将数据附加到框架的代码在 ID 选择器中有错字。

$.post( "pictureDirectory.php", function( data ) 

    $('#picureFrame').append(data);
             ^^here
    startSlideshow($('#pictureFrame > img:first'));
);

应该是这样的

$('#pictureFrame').append(data); 

【讨论】:

【参考方案2】:

.find() 获取当前匹配元素集中每个元素的后代。

> 选择“parent”指定的元素中“child”指定的所有直接子元素。 试试:

startSlideshow($("#pictureFrame").find("img:first"));

如果img 不是#pictureFrame 的直接子级,.find() 应该可以工作。

【讨论】:

如果 img 不是 #pictureFrame 的直接子级,你可能是一个解决方案 对此解决方案稍作解释会有所帮助。【参考方案3】:

你应该知道两者的区别

委托活动

直接事件

检查this 了解直接事件和委托事件之间的区别。

如果我们点击我们新添加的项目,什么都不会发生。这是因为我们之前附加的直接绑定的事件处理程序。直接事件仅在调用 .on() 方法时附加到元素。在这种情况下,由于在调用 .on() 时我们的新锚点不存在,因此它不会获取事件处理程序。

查看link 官方 JQuery 文档以获得进一步说明。

【讨论】:

以上是关于追加后Jquery选择器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

修改 DOM 后 jQuery 选择器不起作用 [重复]

使用jquery动态更改背景颜色后,背景颜色的CSS悬停选择器不起作用

Jquery $('class', this) 选择器不起作用

jQuery不是选择器不起作用

类的jquery选择器选择器不起作用(bootpeg)[重复]

jQuery 选择器,包括属性和同级选择器不起作用