如何通过jQuery动态添加元素

时间:2012-01-20 00:58:39

标签: javascript jquery

下面的脚本创建了一个滑块小部件,它获取一个定义列表并将其转换为幻灯片。每个dt元素都通过css旋转成为“脊椎”,用于显示dt的兄弟dd元素。

我要做的是增强它,以便我可以选择从布局中移除刺,只需使用幻灯片两侧的前进和后退按钮。为此,我通过CSS将dt设置为display:none,并使用“Remove spine layout”注释下的代码来测试可见。

这可以很好地去除刺,现在我需要动态创建2个绝对定位的div来保存左箭头和右箭头图像,以及附加一个点击处理程序。

我的第一个问题是我创建div的尝试无效。

任何帮助都非常感激。

jQuery.noConflict();
(function(jQuery) {
    if (typeof jQuery == 'undefined') return;

    jQuery.fn.easyAccordion = function(options) {

    var defaults = {            
        slideNum: true,
        autoStart: false,
        pauseOnHover: true,
        slideInterval: 5000
    };

    this.each(function() {

        var settings = jQuery.extend(defaults, options);
        jQuery(this).find('dl').addClass('easy-accordion');

        // -------- Set the variables ------------------------------------------------------------------------------

        jQuery.fn.setVariables = function() {
            dlWidth = jQuery(this).width()-1;
            dlHeight = jQuery(this).height();
            if (!jQuery(this).find('dt').is(':visible')){
                dtWidth = 0;
                dtHeight = 0;
                slideTotal = 0;
            // Add an element to rewind to previous slide
                var slidePrev = document.createElement('div');
                slidePrev.className = 'slideAdv prev';
                jQuery(this).append(slidePrev);
                jQuery('.slideAdv.prev').css('background':'red','width':'50px','height':'50px');

            // Add an element to advance to the next slide
                var slideNext = document.createElement('div');
                slideNext.className = 'slideAdv next';
                jQuery(this).append(slideNext);
                jQuery('.slideAdv.next').css('background':'green','width':'50px','height':'50px');
            }
            else
            {
                dtWidth = jQuery(this).find('dt').outerHeight();
                if (jQuery.browser.msie){ dtWidth = jQuery(this).find('dt').outerWidth();}
                dtHeight = dlHeight - (jQuery(this).find('dt').outerWidth()-jQuery(this).find('dt').width());
                slideTotal = jQuery(this).find('dt').size();
            }

            ddWidth = dlWidth - (dtWidth*slideTotal) - (jQuery(this).find('dd').outerWidth(true)-jQuery(this).find('dd').width());
            ddHeight = dlHeight - (jQuery(this).find('dd').outerHeight(true)-jQuery(this).find('dd').height());
        };
        jQuery(this).setVariables();

        // -------- Fix some weird cross-browser issues due to the CSS rotation -------------------------------------

        if (jQuery.browser.safari){ var dtTop = (dlHeight-dtWidth)/2; var dtOffset = -dtTop;  /* Safari and Chrome */ }
        if (jQuery.browser.mozilla){ var dtTop = dlHeight - 20; var dtOffset = - 20; /* FF */ }
        if (jQuery.browser.msie){ var dtTop = 0; var dtOffset = 0; /* IE */ }
        if (jQuery.browser.opera){ var dtTop = (dlHeight-dtWidth)/2; var dtOffset = -dtTop; } /* Opera */

        // -------- Getting things ready ------------------------------------------------------------------------------

        var f = 1;
        var paused = false;
        jQuery(this).find('dt').each(function(){
            jQuery(this).css({'width':dtHeight,'top':dtTop,'margin-left':dtOffset});
            // add unique id to each tab
            jQuery(this).addClass('spine_' + f);
            // add active corner
            var corner = document.createElement('div');
                corner.className = 'activeCorner spine_' + f;
            jQuery(this).append(corner);

            if(settings.slideNum == true){
                jQuery('<span class="slide-number">'+f+'</span>').appendTo(this);
                if(jQuery.browser.msie){    
                    var slideNumLeft = parseInt(jQuery(this).find('.slide-number').css('left'));
                    if(jQuery.browser.version == 6.0 || jQuery.browser.version == 7.0){
                        jQuery(this).find('.slide-number').css({'bottom':'auto'});
                        slideNumLeft = slideNumLeft - 14;
                        jQuery(this).find('.slide-number').css({'left': slideNumLeft})
                    }
                    if(jQuery.browser.version == 8.0 || jQuery.browser.version == 9.0){
                    var slideNumTop = jQuery(this).find('.slide-number').css('bottom');
                    var slideNumTopVal = parseInt(slideNumTop) + parseInt(jQuery(this).css('padding-top'))  - 20; 
                    jQuery(this).find('.slide-number').css({'bottom': slideNumTopVal});
                        slideNumLeft = slideNumLeft - 10;
                    jQuery(this).find('.slide-number').css({'left': slideNumLeft})
                    jQuery(this).find('.slide-number').css({'marginTop': 10});
                    }
                } else {
                    var slideNumTop = jQuery(this).find('.slide-number').css('bottom');
                    var slideNumTopVal = parseInt(slideNumTop) + parseInt(jQuery(this).css('padding-top')); 
                    jQuery(this).find('.slide-number').css({'bottom': slideNumTopVal}); 
                }
            }
            f = f + 1;
        });

        if(jQuery(this).find('.active').size()) { 
            jQuery(this).find('.active').next('dd').addClass('active');
        } else {
            jQuery(this).find('dt:first').addClass('active').next('dd').addClass('active');
        }

        jQuery(this).find('dt:first').css({'left':'0'}).next().css({'left':dtWidth});
        jQuery(this).find('dd').css({'width':ddWidth,'height':ddHeight});   


        // -------- Functions ------------------------------------------------------------------------------

        jQuery.fn.findActiveSlide = function() {
                var i = 1;
                this.find('dt').each(function(){
                if(jQuery(this).hasClass('active')){
                    activeID = i; // Active slide
                } else if (jQuery(this).hasClass('no-more-active')){
                    noMoreActiveID = i; // No more active slide
                }
                i = i + 1;
            });
        };

        jQuery.fn.calculateSlidePos = function() {
            var u = 2;
            jQuery(this).find('dt').not(':first').each(function(){  
                var activeDtPos = dtWidth*activeID;
                if(u <= activeID){
                    var leftDtPos = dtWidth*(u-1);
                    jQuery(this).animate({'left': leftDtPos});
                    if(u < activeID){ // If the item sits to the left of the active element
                        jQuery(this).next().css({'left':leftDtPos+dtWidth});    
                    } else{ // If the item is the active one
                        jQuery(this).next().animate({'left':activeDtPos});
                    }
                } else {
                    var rightDtPos = dlWidth-(dtWidth*(slideTotal-u+1));
                    jQuery(this).animate({'left': rightDtPos});
                    var rightDdPos = rightDtPos+dtWidth;
                    jQuery(this).next().animate({'left':rightDdPos});   
                }
                u = u+ 1;
            });
            setTimeout( function() {
                jQuery('.easy-accordion').find('dd').not('.active').each(function(){ 
                    jQuery(this).css({'display':'none'});
                });
            }, 400);
        };

        jQuery.fn.activateSlide = function() {
            this.parent('dl').setVariables();   
            this.parent('dl').find('dd').css({'display':'block'});
            this.parent('dl').find('dd.plus').removeClass('plus');
            this.parent('dl').find('.no-more-active').removeClass('no-more-active');
            this.parent('dl').find('.active').removeClass('active').addClass('no-more-active');
            this.addClass('active').next().addClass('active');  
            this.parent('dl').findActiveSlide();
            if(activeID < noMoreActiveID){
                this.parent('dl').find('dd.no-more-active').addClass('plus');
            }
            this.parent('dl').calculateSlidePos();  
        };

        jQuery.fn.rotateSlides = function(slideInterval, timerInstance) {
            var accordianInstance = jQuery(this);
            timerInstance.value = setTimeout(function(){accordianInstance.rotateSlides(slideInterval, timerInstance);}, slideInterval);
            if (paused == false){
                jQuery(this).findActiveSlide();
                var totalSlides = jQuery(this).find('dt').size();
                var activeSlide = activeID;
                var newSlide = activeSlide + 1;
                if (newSlide > totalSlides) {newSlide = 1; paused = true;}
                jQuery(this).find('dt:eq(' + (newSlide-1) + ')').activateSlide(); // activate the new slide
            }
        }

        // -------- Let's do it! ------------------------------------------------------------------------------

        function trackerObject() {this.value = null}
        var timerInstance = new trackerObject();

        jQuery(this).findActiveSlide();
        jQuery(this).calculateSlidePos();

        if (settings.autoStart == true){
            var accordianInstance = jQuery(this);
            var interval = parseInt(settings.slideInterval);
            timerInstance.value = setTimeout(function(){
                accordianInstance.rotateSlides(interval, timerInstance);
                }, interval);
        } 

        jQuery(this).find('dt').not('active').click(function(){
            var accordianInstance = jQuery(this); //JSB to fix bug with IE < 9
            jQuery(this).activateSlide();
            clearTimeout(timerInstance.value);
            timerInstance.value = setTimeout(function(){
                accordianInstance.rotateSlides(interval, timerInstance);
                }, interval);
        }); 

        if (!(jQuery.browser.msie && jQuery.browser.version == 6.0)){ 
            jQuery('dt').hover(function(){
                jQuery(this).addClass('hover');
            }, function(){
                jQuery(this).removeClass('hover');
            });
        }
        if (settings.pauseOnHover == true){
            jQuery('dd').hover(function(){
                paused = true;
            }, function(){
                paused = false;
            });
        }
    });
    };
})(jQuery);

1 个答案:

答案 0 :(得分:3)

在jQuery中创建元素很简单:

$newDiv = $('<div />');
$newDiv.css({
  'position': 'absolute',
  'top': '10px',
  'left': '10px'
});

$newDiv.on('click', function() {
  alert('You have clicked me');
});

$('#your_container').append($newDiv);