dom编程艺术章12

function addLoadEvent(func){//添加事件函数
    var oldonload = window.onload;
    if(typeof window.onload != 'function'){
        window.onload = func;
    }else{
        window.onload = function(){
            oldonload();
            func();
        }
    }    
}

function insertAfter(newElement,targetElement){//自带的是insertBefore()方法
    var parent = targetElement.parentNode;
    if( parent.lastChild == targetElement){
        parent.appendChild(newElement);
    }else{
        parent.insertBefore(newElement,targetElement.nextSibling);
    }
}

function addClass(element,value){
    if(!element.className){
        element.className = value;
    }else{
        newClassName = element.className;
        newClassName += ' ';
        newClassName += value;
        element.className = newClassName;
    }
}

function highlightPage(){
    if( !document.getElementById) return false;
    if( !document.getElementsByTagName ) return false;
    var headers = document.getElementsByTagName('header');
    if( headers.length == 0) return false;
    var navs = headers[0].getElementsByTagName('nav');
    if( navs.length == 0 ) return false;
    var links = navs[0].getElementsByTagName('a');
    var url = window.location.href;
    for(var i=0;i<links.length;i++){
        var linkurl = links[i].getAttribute('href');
        if( url.indexOf(linkurl) != -1 ){//如果在url(如…….html/live.html)中查找到了linkurl(如live.html),就添加here类
            links[i].setAttribute('href','#');
            links[i].className = 'here' ;
        }
    }
}

function prepareSlideshow(){//图片库 第九章好像?
    if(!document.getElementById('intro')) return false;
    var slideshow = document.createElement('div');
    slideshow.setAttribute('id','slideshow');
    var frame = document.createElement('img');
    frame.setAttribute('id','frame');
    frame.setAttribute('src','images/frame.gif');
    slideshow.appendChild(frame);
    var preview = document.createElement('img');
    preview.setAttribute('id','preview');
    preview.setAttribute('src','images/slideshow.gif');
    slideshow.appendChild(preview);
    var intro = document.getElementById('intro');
    insertAfter(slideshow,intro);
    var links = document.getElementsByTagName('a');
    for(var i=0;i<links.length;i++){
        links[i].onmouseover=function(){
            var destiation = this.getAttribute('href');
            if( destiation.indexOf('index.html') != -1){
                moveElement('preview',0,0,10);
            }
            if( destiation.indexOf('about.html') != -1){
                moveElement('preview',-150,0,10);
            }
            if( destiation.indexOf('photos.html') != -1){
                moveElement('preview',-300,0,10);
            }
            if( destiation.indexOf('live.html') != -1){
                moveElement('preview',-450,0,10);
            }
            if( destiation.indexOf('contact.html') != -1){
                moveElement('preview',-600,0,10);
            }
            
        }    
    }
}

function moveElement(elementID,final_x,final_y,interval){
    var elem = document.getElementById(elementID);
    if( !elem.style.left) {elem.style.left = 0;}
    if( !elem.style.top) {elem.style.top = 0;}
    var xpos = parseInt(elem.style.left);
    var ypos = parseInt(elem.style.top);
    var dist;
    if(elem.movement) { clearTimeout(elem.movement)}; 
    if( xpos == final_x && ypos == final_y ){
        return true;
    }
    if( xpos < final_x){
        dist = Math.ceil((final_x - xpos)/10);
        xpos = xpos + dist;
    }
    if( xpos > final_x){
        dist = Math.ceil((xpos - final_x)/10);
        xpos = xpos - dist;
    }
    if( ypos < final_y){
        dist = Math.ceil((final_y - ypos)/10);
        ypos = ypos + dist;
    }
    if( ypos > final_y){
        dist = Math.ceil((final_y - ypos)/10);
        ypos = ypos - dist;
    }
    elem.style.left = xpos +'px';
    elem.style.top = ypos +'px';
    var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
    elem.movement = setTimeout(repeat,interval);
}
//About
function prepareShowSection(){
    if( !document.getElementById) return false;
    if( !document.getElementsByTagName) return false;
    var article = document.getElementsByTagName('article');
    if( article.length == 0 ) return false;
    var nav = article[0].getElementsByTagName('nav');
    if( nav.length == 0 ) return false;
    var links = nav[0].getElementsByTagName('a');
    for(var i=0;i<links.length;i++){
        document.getElementsByTagName('section')[i].style.display = 'none';
        var sectionId = links[i].getAttribute('href').split('#')[1];
        links[i].destination = sectionId;
        if( !document.getElementById(sectionId)) continue;
        links[i].onclick = function(){
            showSection(this.destination);
            return false;
        }
    }
    
}

function showSection(id){
    var sections = document.getElementsByTagName('section');
    for(var i=0;i<sections.length;i++){
        if(sections[i].getAttribute('id') != id){
            sections[i].style.display = 'none';
        }else{
            sections[i].style.display = 'block';
        }
    }
}

//photos
function preparePlaceholder(){
    if( !document.getElementById) return false;
    if( !document.getElementsByTagName ) return false;
    if( !document.getElementById('imagegallery')) return false;
    var placeholder = document.createElement('img');
    placeholder.setAttribute('id','placeholder');
    placeholder.setAttribute('src','images/placeholder.gif');
    var description = document.createElement('p');
    description.setAttribute('id','description');
    var text = document.createTextNode('choose an image');
    description.appendChild(text);
    var imagegallery= document.getElementById('imagegallery');
    insertAfter(description,imagegallery);
    insertAfter(placeholder,description);
}

function prepareGallery(){
    if( !document.getElementById('imagegallery')) return false;
    var imagegallery = document.getElementById('imagegallery');
    var links = imagegallery.getElementsByTagName('a');
    for(var i=0;i<links.length;i++){
        links[i].onclick = function(){
            return showpic(this);
        }        
    }
}

function showpic(whichpic){
    if( !document.getElementById('placeholder')) return true;
    var imageurl = whichpic.getAttribute('href');
    var placeholder = document.getElementById('placeholder');
    placeholder.setAttribute('src',imageurl);
    if( !document.getElementById('description')) return false;
    if( !whichpic.getAttribute('title')){
        var title = '';
    }else{
        var title = whichpic.getAttribute('title');
    }
    var description = document.getElementById('description');
    if( description.firstChild.nodeType == 3){
        description.firstChild.nodeValue = title;
    }
    return false;
}

//live
function stripeTables(){
    var tables = document.getElementsByTagName('table');
    for(var i=0;i<tables.length;i++){
        var rows = tables[i].getElementsByTagName('tr');
        var odd = false;
        for(var j=0;j<rows.length;j++){
            if( odd == false ){
                odd = true;
            }else{
                addClass(rows[j],'odd');
                odd = false;
            }
        }
    }
}

function highlightRows(){//表格斑马线样式
    var tables = document.getElementsByTagName('table');
    for(var i=0;i<tables.length;i++){
        var rows = tables[i].getElementsByTagName('tr');
        for(var j=0;j<rows.length;j++){
            var oldClassname = rows[j].className;
            rows[j].onmouseover = function(){
                 addClass(this,'highlight');
            }
            rows[j].onmouseout = function(){
                this.className = oldClassname;
            }
        }
    }
}

function displayAbbreviations(){
    if( !document.getElementsByTagName('abbr')) return false;
    var defs = new Array();
    var abbrs = document.getElementsByTagName('abbr');
    if( abbrs.length ==0) return false;
    for(var i=0;i<abbrs.length;i++){
        if( abbrs[i].childNodes.length <1) continue;
        var key = abbrs[i].firstChild.nodeValue;
        var definition = abbrs[i].getAttribute('title');
        defs[key] = definition;
    }
    var dlist = document.createElement('dl');
    for(var key in defs){
        var dtitle = document.createElement('dt');
        var dtitle_text = document.createTextNode(key);
        dtitle.appendChild(dtitle_text);
        var ddtitle = document.createElement('dd');
        var definition = defs[key];
        var ddtitle_text = document.createTextNode(definition);
        ddtitle.appendChild(ddtitle_text);
        dlist.appendChild(dtitle);
        dlist.appendChild(ddtitle);        
    }
    var header = document.createElement('h3');
    var header_text = document.createElement('Abbreviations');
    header.appendChild(header_text);
    var articles = document.getElementsByTagName('article');
    if( articles.length == 0) return false;
    articles[0].appendChild(header);
    articles[0].appendChild(dlist);
    
}

/*contact*/
function focusLabels(){
    var labels = document.getElementsByTagName('label');
    for( var i=0;i<labels.length;i++){
        if( !labels[i].getAttribute('for') ) continue;
        labels[i].onclick = function(){
            var id = this.getAttribute('for');
            if( !document.getElementById(id)) return false;
            var elem = document.getElementById(id);
            elem.focus();
        }
        
    }
}

function prepareForms(){
    for(var i=0;i< document.forms.length;i++){
        var thisform = document.forms[i];
        resetFields(thisform);
        thisform.onsubmit = function(){
            if(!validateForm(this)) return false;
            var article = document.getElementsByTagName('article')[0];
            if(submitFormWithAjax(this,article)) return false;
            return true;
        }
    }
}

function resetFields(whichform){
    if( Modernizr.input.placeholder )  return;
    for(var i=0;i< whichform.elements.length; i++){
        var element = whichform.elements[i];
        if(element.type == 'submit') continue;
        var check = element.placeholder || element.getAttribute('placeholder');
        if( !check) continue;
        var placeholder = element.getAttribute('placeholder');
        //element.className = 'placeholder';
        //element.value = placeholder;
        element.onfocus= function(){
            var text = this.placeholder || this.getAttribute('placeholder');
            if( this.value == text){
                this.value = '';
            }
            
        }
        element.onblur = function(){        
            if( this.value == ''){
                this.className = 'placeholder';
                this.value = this.placeholder || this.getAttribute('placeholder');
            }
        }
        element.onblur();
        
    }
}
/*表单*/
function validateForm(whichform){//有效性检验
    for(var i=0;i<whichform.elements.length;i++){
        var elem = whichform.elements[i];
        var elem_required = elem.required || elem.getAttribute('required');
        if( elem_required == '' || elem_required == 'required'){
            var elem_name = elem.name || elem.getAttribute('name');
            if( !isFilled(elem) ){
                alert('please fill in '+elem_name +'  '+'field.');
                return false;
            }
            if( elem.getAttribute('id') == 'email'){ //或者elem.type == 'email'
                if( !isEmail(elem)){
                    alert('请输入正确的邮箱地址');
                    return false;
                }
            }
        }
    }
    return true;
}



function isFilled(field){
    if(field.value.replace(' ','').length == 0) return false;
    var placeholder = field.placeholder || field.getAttribute('placeholder');
    return (field.value != placeholder);
    
}

function isEmail(field){
    return (field.value.indexOf('@') != -1   && field.value.indexOf('.') != -1); 
}

/*ajax*/
function submitFormWithAjax(whichform,thetarget){
    var request = getHTTPObject();
    if(!request) return false;
    displayAjaxLoading(thetarget);
    var dataParts = [];
    for(i=0;i<whichform.elements.length;i++){
        var elem = whichform.elements[i];
        dataParts[i] = elem.getAttribute('name') + '=' + encodeURIComponent(elem.value);
    }
    var data = dataParts.join('&');
    request.open('POST',whichform.getAttribute('action'),true);
    request.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    request.onreadystatechange = function(){
        if(request.readyState == '4'){
            if( request.status ==200 || request.status ==0 ){
                var matches = request.responseText.match(/<article>([\s\S]+)<\/article>/);
                if( matches.length > 0){
                    thetarget.innerHTML = matches[1];//注意match[0]与match[1]
                }else{
                    thetarget.innerHTML = '<p>Oops,there was an error.Sorry.</p>';
                }
            }else{
                thetarget.innerHTML = '<p>' + request.statusText + '</p>';
            }
        }
        
    }
    request.send(data);
    return true;
}


function getHTTPObject(){
    if(typeof XMLHttpRequest == 'undefined'){
        try{ return new ActiveXObject('Msxml2.XMLHTTP.6.0');}
        catch(e){}
        try{ return new ActiveXObject('Msxml2.XMLHTTP.3.0');}
        catch(e){}
        try{ return new ActiveXObject('Msxml2.XMLHTTP');}
        catch(e){}
        return false;
    }else{
        return new XMLHttpRequest();
    }
}

function displayAjaxLoading(element){
    while(element.hasChildNodes()){
        element.removeChild(element.lastChild);
    }
    var content = document.createElement('img');
    content.setAttribute('src','images/loading.gif');
    content.setAttribute('alt','Loading^');
    element.appendChild(content);
    console.log(element);
}

 

posted @ 2019-02-07 11:25  林不渡  阅读(185)  评论(0编辑  收藏  举报