0

我有这段代码,它在向下滚动时显示“页面顶部”链接:

window.addEvent('load', function() {
                new JCaption('img.caption');
            });
function fade_me(num){
    var smoothtop=document.id('smoothtop');
    if(smoothtop){smoothtop.fade(window.getScrollTop()<250?0:num);}
}
window.addEvent('domready',function(){
    var scroll=new Fx.Scroll(window,{
        'duration': 500,
        'transition':   Fx.Transitions.Bounce.easeInOut,
        'wait':     false
    });
    var smoothtop=new Element('div',{
        'id':       'smoothtop',
        'class':    'smoothtop',
        'style':    'position:fixed; display:block; visibility:visible; zoom:1; opacity:0; cursor:pointer; right:5px; bottom:5px;',
        'title':    '',
        'html':     '',
        'events':{
            mouseover: function(){fade_me(1);},
            mouseout: function(){fade_me(0.7);},
            click: function(){scroll.toTop();}
        }
    }).inject(document.body);


    document.id('smoothtop').setStyle('opacity','0');
});
window.addEvent('scroll',function(){fade_me(0.7);});

//this is what I added
var ii = document.getElementById('smoothtop');
ii.childNodes[0].nodeValue = '<i class="icon icon-chevron-up"></i>';
//these two lines

如您所见,代码生成了一个 id 为 smoothtop 的 div。它有一个向上箭头的图片来指示页面的顶部。相反,我想使用 BootStrap 的 glyphicon

<i class="icon icon-chevron-up"></i>

我试图将此内容添加到 div smoothtop。当我用 FireBug 检查代码时,它说:

TypeError: ii is null

var ii = document.getElementById('smoothtop');

我不知道我在哪里和/或做错了什么?我想问我如何添加<i></i>到由js创建的div中?

4

3 回答 3

3

鉴于您的示例,最简单的方法是html在创建元素时使用该属性:

var smoothtop=new Element('div',{
    'id':       'smoothtop',
    'class':    'smoothtop',
    'style':    'position:fixed; display:block; visibility:visible; zoom:1; opacity:0; cursor:pointer; right:5px; bottom:5px;',
    'title':    '',
    'html':     '<i class="icon icon-chevron-up"></i>', // <-- right here
    'events':{
        mouseover: function(){fade_me(1);},
        mouseout: function(){fade_me(0.7);},
        click: function(){scroll.toTop();}
    }
}).inject(document.body);
于 2013-08-28T14:03:45.817 回答
2

您的代码在domready处理程序之外,但创建元素的代码放在domready处理程序内。因此,var ii = document.getElementById('smoothtop');甚至在创建元素之前执行。

只需将代码放在domready处理程序的末尾,ii引用就不会是null.

另外,我强烈建议您使用库的帮助程序类和函数来操作 DOM,因为您的库可能会处理跨浏览器问题和其他烦恼。

但是,在 vanilla JS 中,您可以这样做:

var smoothtopEl = document.getElementById('smoothtop'),
    i = document.createElement('i');

i.className = 'icon icon-chevron-up';
smoothtopEl.appendChild(i);
于 2013-08-28T14:05:49.510 回答
1

动态创建元素时,试试这个:

var smoothtop=new Element('div',{
    'id':       'smoothtop',
    'class':    'smoothtop',
    'style':    'position:fixed; display:block; visibility:visible; zoom:1; opacity:0; cursor:pointer; right:5px; bottom:5px;',
    'title':    '',
    'html':     '<i class="icon icon-chevron-up"></i>',
    'events':{
        mouseover: function(){fade_me(1);},
        mouseout: function(){fade_me(0.7);},
        click: function(){scroll.toTop();}
    }
}).inject(document.body);

通过这种方式,您可以将元素直接注入 DOM 树,而无需稍后填充。

于 2013-08-28T14:03:33.877 回答