`
lwt_cedric
  • 浏览: 114830 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JS阅读

阅读更多
我读了一下代码,觉得还可以,留个印。

/*
* EnhanceJS version 1.0a - Test-Driven Progressive Enhancement
* Copyright (c) 2010 Filament Group, Inc, authors.txt
* Licensed under MIT (license.txt)
*/
(function(win, doc) {
var settings, body, windowLoaded, head;

if(doc.getElementsByTagName){ head = doc.getElementsByTagName('head')[0] || doc.documentElement; }
else{ head = doc.documentElement; }

enhance = function(options) {
    options  = options || {};
    settings = {};
   
    // mixin settings
    for (var name in enhance.defaultSettings) {
        var option = options[name];
        settings[name] = option !== undefined ? option : enhance.defaultSettings[name];
    }
   
    // mixin additional tests
    for (var test in options.addTests) {
        settings.tests[test] = options.addTests[test];
    }
   
    runTests();
   
    applyDocReadyHack();
   
    windowLoad(function() {
        windowLoaded = true;
    });
};

enhance.defaultTests = {
    getById: function() {
        return !!doc.getElementById;
    },
    getByTagName: function() {
        return !!doc.getElementsByTagName;
    },
    createEl: function() {
        return !!doc.createElement;
    },
    boxmodel: function() {
        var newDiv = doc.createElement('div');
        newDiv.style.cssText = 'width: 1px; padding: 1px;';
        body.appendChild(newDiv);
        var divWidth = newDiv.offsetWidth;
        body.removeChild(newDiv);
        return divWidth === 3;
    },
    position: function() {
        var newDiv = doc.createElement('div');
        newDiv.style.cssText = 'position: absolute; left: 10px;';
        body.appendChild(newDiv);
        var divLeft = newDiv.offsetLeft;
        body.removeChild(newDiv);
        return divLeft === 10;
    },
    floatClear: function() {
        var pass = false,
            newDiv = doc.createElement('div'),
            style = 'style="width: 5px; height: 5px; float: left;"';
        newDiv.innerHTML = '<div ' + style + '></div><div ' + style + '></div>';
        body.appendChild(newDiv);
        var childNodes = newDiv.childNodes,
            topA = childNodes[0].offsetTop,
            divB = childNodes[1],
            topB = divB.offsetTop;
        if (topA === topB) {
            divB.style.clear = 'left';
            topB = divB.offsetTop;
            if (topA !== topB) {
                pass = true;
            }
        }
        body.removeChild(newDiv);
        return pass;
    },
    overflow: function() {
        var newDiv = doc.createElement('div');
        newDiv.innerHTML = '<div style="height: 10px; overflow: hidden;"></div>';
        body.appendChild(newDiv);
        var divHeight = newDiv.offsetHeight;
        body.removeChild(newDiv);
        return divHeight === 10;
    },
    ajax: function() {
        //factory test borrowed from quirksmode.org
        var xmlhttp = false, index = -1, factory,
            XMLHttpFactories = [
                function() { return new XMLHttpRequest() },
                function() { return new ActiveXObject("Msxml2.XMLHTTP") },
                function() { return new ActiveXObject("Msxml3.XMLHTTP") },
                function() { return new ActiveXObject("Microsoft.XMLHTTP") }
            ];
        while ((factory = XMLHttpFactories[++index])) {
            try { xmlhttp = factory(); }
            catch (e) { continue; }
            break;
        }
        return !!xmlhttp;
    },
    resize: function() {
        return win.onresize != false;
    },
    print: function() {
        return !!win.print;
    }
};

enhance.defaultSettings = {
    testName: 'enhanced',
    loadScripts: [],
    loadStyles: [],
    queueLoading: true,
    appendToggleLink: true,
    forcePassText: 'View high-bandwidth version',
    forceFailText: 'View low-bandwidth version',
    tests: enhance.defaultTests,
    addTests: {},
    alertOnFailure: false,
    onPass: function(){},
    onFail: function(){},
    onLoadError: addIncompleteClass
};

function cookiesSupported(){
var testCookie = 'enhancejs-cookietest';
createCookie(testCookie, 'enabled');
var result = readCookie(testCookie);
eraseCookie(testCookie);
return result === 'enabled';
}
enhance.cookiesSupported = cookiesSupported();

function forceFail() {
    createCookie(settings.testName, 'fail');
    win.location.reload();
}
if(enhance.cookiesSupported){ enhance.forceFail = forceFail; }


function forcePass() {
    createCookie(settings.testName, 'pass');
    win.location.reload();
}
if(enhance.cookiesSupported){ enhance.forcePass = forcePass; }

function reTest() {
    eraseCookie(settings.testName);
    win.location.reload();
}
if(enhance.cookiesSupported){ enhance.reTest = reTest; }

function runTests() {
    var result = readCookie(settings.testName);
       
    //check for cookies from a previous test
    if (result) {
        if (result === 'pass') {
            enhancePage();
            settings.onPass();
        } else {
            settings.onFail();
        }
       
        // append toggle link
        if (settings.appendToggleLink) {
            windowLoad(function() {
                appendToggleLinks(result);
            });
        }
    }
    //no cookies - run tests
    else {
        bodyOnReady(function() {
            var pass = true;
            for (var name in settings.tests) {
                pass = settings.tests[name]();
                if (!pass) {
                    if (settings.alertOnFailure) {
                        alert(name + ' failed');
                    }
                    break;
                }
            }
           
            result = pass ? 'pass' : 'fail';
            createCookie(settings.testName, result);
            if (pass) {
                enhancePage();
                settings.onPass();
            } else {
                settings.onFail();
            }
           
            // append toggle link
            if (settings.appendToggleLink) {
                windowLoad(function() {
                    appendToggleLinks(result);
                });
            }
        });
    }
}

function bodyOnReady(callback) {
    var checkBody = setInterval(bodyReady, 1);
    function bodyReady() {
        if (doc.body) {
            body = doc.body;
            clearInterval(checkBody);
            callback();
        }
    }
}

function windowLoad(callback) {
    if (windowLoaded) {
        callback();
    } else {
        var oldonload = win.onload
        win.onload = function() {
            if (oldonload) { oldonload(); }
            callback();
        }
    }
}

function appendToggleLinks(result) {
    if (!settings.appendToggleLink || !enhance.cookiesSupported) { return; }
       
    if (result) {
        var a = doc.createElement('a');
        a.href = "#";
        a.className = settings.testName + '_toggleResult';
        a.innerHTML = result === 'pass' ? settings.forceFailText : settings.forcePassText;
        a.onclick   = result === 'pass' ? enhance.forceFail : enhance.forcePass;
        doc.getElementsByTagName('body')[0].appendChild(a);
    }
}

function enhancePage() {
    if (doc.documentElement.className.indexOf(settings.testName) === -1) {
        doc.documentElement.className += ' ' + settings.testName;
    }
   
    if (settings.loadStyles.length) {
        appendStyles();
    }
    if (settings.loadScripts.length) {
        settings.queueLoading ? appendScriptsSync() : appendScriptsAsync();
    }
}

function addIncompleteClass (){
var errorClass = settings.testName + '-incomplete';
if (doc.documentElement.className.indexOf(errorClass) === -1) {
        doc.documentElement.className += ' ' + errorClass;
    }
}

function appendStyles() {
    var index = -1,
        item;
   
    while ((item = settings.loadStyles[++index])) {
        var link  = doc.createElement('link');
       
        link.type = 'text/css';
        link.rel  = 'stylesheet';
        link.onerror = settings.onLoadError;
       
        if (typeof item === 'string') {
            link.href = item;
            head.appendChild(link);
        }
        else {
            for (var attr in item) {
                if (attr !== 'iecondition') {
                    link.setAttribute(attr, item[attr]);
                }   
            }
            if (item['iecondition'] && isIE()) {
                if (isIE(item['iecondition'])) {
                    head.appendChild(link);
                }
            }
            else if (!item['iecondition']) {
                head.appendChild(link);
            }
        }
    }
}

function isIE(version) {
var isIE = (/MSIE (\d+)\.\d+;/).test(navigator.userAgent);
var ieVersion = new Number(RegExp.$1);
if(isIE && version){
if (version === 'all' || version == ieVersion) { return true; }
}
else{ return isIE; }
}

function appendScriptsSync() {
    var queue = [].concat(settings.loadScripts);
   
    function next() {
        if (queue.length === 0) {
            return;
        }
       
        var item    = queue.shift();
            script = createScriptTag(item),
            done   = false;
        if(script){
        script.onload = script.onreadystatechange = function() {
            if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) {
                done = true;
                next();
                this.onload = this.onreadystatechange = null;
            }
        }
        head.insertBefore(script, head.firstChild);
        }
        else{
        next();
        }
    }
   
    next();
}

function appendScriptsAsync() {
    var index = -1,
        item;
       
    while ((item = settings.loadScripts[++index])) {
    var script = createScriptTag(item);
        if(script){
        head.insertBefore(script, head.firstChild);
        }
    }
}

function createScriptTag(item) {
    var script  = doc.createElement('script');
    script.type = 'text/javascript';
    script.onerror = settings.onLoadError;
   
    if (typeof item === 'string') {
        script.src  = item;
        return script;
    }
    else {
        for (var attr in item) {
            if (attr !== 'iecondition') {
                script.setAttribute(attr, item[attr]);
            }   
        }
        if (item['iecondition'] && isIE()) {
            if (isIE(item['iecondition'])) {
                return script;
            }
        }
        else if (!item['iecondition']) {
            return script;
        }
        else{
        return false;
        }
    }
}

/*cookie functions from quirksmode.org*/
function createCookie(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    doc.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = doc.cookie.split(';');
    for (var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
    return null;
}

function eraseCookie(name) {
    createCookie(name,"",-1);
}


function applyDocReadyHack() {
    // verify that document.readyState is undefined
    // verify that document.addEventListener is there
    // these two conditions are basically telling us
    // we are using Firefox < 3.6
    if (doc.readyState == null && doc.addEventListener){
        // on DOMContentLoaded event, supported since ages
        doc.addEventListener("DOMContentLoaded", function DOMContentLoaded(){
            // remove the listener itself
            doc.removeEventListener("DOMContentLoaded", DOMContentLoaded, false);
            // assign readyState as complete
            doc.readyState = "complete";
        }, false);
        // set readyState = loading or interactive
        // it does not really matter for this purpose
        doc.readyState = "loading";
}
}


})(window, document);
分享到:
评论

相关推荐

    基于 html5 、 Vue.js 、 Koa、Node.js 以及 EJS 的手机小说阅读器.zip

    【标题】基于HTML5、Vue.js、Koa、Node.js及EJS的手机小说阅读器是一种现代化的在线阅读平台,利用前沿的Web技术为用户提供流畅的阅读体验。这个项目结合了多种技术,构建了一个功能丰富的手机小说阅读环境。 ...

    Node.js-制作一个阅读体验舒适的Hexo博客主题

    【标题】:“Node.js-制作一个阅读体验舒适的Hexo博客主题” 在当今互联网时代,个人博客成为分享知识、表达观点的重要平台。Hexo是一个基于Node.js的静态站点生成器,它以其高效、简洁的设计和丰富的插件系统深受...

    javascript pdf阅读器

    实现JavaScript PDF阅读器的关键技术可能包括PDF.js,这是一个由Mozilla开发的开源库,专门用于在浏览器中显示PDF文档。它使用HTML5和Canvas元素来渲染PDF内容,并且能够处理分页、缩放、搜索等功能。此外,为了提高...

    js-reading-list:JavaScript阅读清单

    JavaScript阅读清单 这是要阅读JavaScript代码库的集合。 根据粗略的大小将它们分为3类。 较短的代码库(小于1000行的JS) 名称 描述 LOC 星星 道格拉斯·克罗克福德(Douglas Crockford)的JSON实现 约800 国家...

    华旭金卡身份证阅读器js调用案例

    【华旭金卡身份证阅读器js调用案例】 在当今数字化时代,身份证阅读器已经成为许多企业和机构必不可少的设备,尤其对于需要验证用户身份的场景。华旭金卡身份证阅读器是一款高效、便捷的身份证信息读取工具,它能...

    js在线阅读pdf(电脑端)

    总之,利用JavaScript的PDF.js库,我们可以创建一款功能丰富的电脑端在线PDF阅读器。通过不断优化和定制,可以满足用户的各种需求,提供流畅、便捷的阅读体验。记得持续关注PDF.js的更新,以利用最新的特性和修复。

    Eclipse的JavaScript插件 JSEditor

    1. **语法高亮**:JSEditor为JavaScript代码提供色彩鲜明的语法高亮,使得代码更易于阅读和理解。不同的关键字、变量、函数等会以不同的颜色显示,帮助开发者快速识别代码结构。 2. **代码自动完成**:JSEditor包含...

    基于turn.js库电子书在线阅读源码

    【标题】"基于turn.js库电子书在线阅读源码"是一个专为实现在线电子书阅读体验的项目。这个源码利用了turn.js库,该库是JavaScript的一个强大工具,能够创建具有真实翻页效果的数字杂志、电子书和其他文档。通过这个...

    epubjs-reader:Epub.js阅读器

    Epub.js阅读器关于读者库。入门在浏览器中打开 。 您可以通过在URL中传递到bookPath的链接来更改它打开的ePub: ?bookPath=https://s3.amazonaws.com/epubjs/books/alice.epub 本地运行安装 然后使用npm安装项目依赖...

    基于PDF.js的pdfViewer阅读器代码

    PDF.js是Mozilla团队开发的一个开源JavaScript库,用于在Web浏览器中渲染PDF文档,无需依赖任何插件。这个项目的目标是提供一个高质量、跨平台的PDF查看体验,支持现代Web浏览器,包括Chrome、Firefox、Safari、Edge...

    js在线阅读pdf(手机端)

    "js在线阅读pdf(手机端)"这个主题涉及到的技术主要包括JavaScript库PDF.js和针对移动优化的用户界面设计。PDF.js是由Mozilla开发的一个开源库,旨在提供高质量的PDF文档在浏览器中的渲染能力,无需依赖任何第三方...

    毕业设计基于JavaScript的在线小说阅读管理系统源码+项目说明.zip

    毕业设计基于JavaScript的在线小说阅读管理系统源码+项目说明.zip 毕业设计基于JavaScript的在线小说阅读管理系统源码+项目说明.zip 毕业设计基于JavaScript的在线小说阅读管理系统源码+项目说明.zip 1、该资源内...

    echojs-reader:使用React Native构建的开源EchoJS阅读器

    EchoJS阅读器 使用React Native构建的开源阅读器。 安装 单击上方的徽章以从Apple App Store或Google Play安装它。 Android用户还可以从下载APK文件并手动安装。 屏幕截图 执照 阿帕奇2.0

    jsfive:纯JavaScript HDF5阅读器

    jsfive:纯JavaScript的HDF5文件阅读器jsfive是一个库,用于使用纯JavaScript(例如,在浏览器中)读取(当前不编写)HDF5文件。 它基于HDF5阅读器的纯python实现。 不支持HDF5的所有功能,但某些关键功能包括: ...

    能够格式化凌乱的js,便于阅读

    能够格式化凌乱的js,便于阅读 ,能够格式化凌乱的js,便于阅读

    turn.js+pdf.js资源

    PDF.js是Mozilla开发的一个开源项目,旨在提供一个纯JavaScript实现的PDF阅读器,能够在浏览器中直接解析和渲染PDF文件,无需依赖任何插件。这使得用户可以在任何支持HTML5的浏览器上查看PDF文档,提高了网页的兼容...

    javascript,js帮助文档

    JavaScript,简称JS,是一种轻量级的解释型编程语言,广泛应用于网页和互联网应用开发。作为客户端脚本语言,它可以直接在用户的浏览器上运行,无需服务器...对于JS初学者,阅读官方文档和实践案例是很好的学习途径。

    pinyin4js是一个汉字转拼音的Javascript开源库

    开发者可以通过解压这个压缩包,查看源码、阅读文档,甚至运行测试来了解和使用pinyin4js库。 **综合知识点总结:** 1. **pinyin4js** 是一个JavaScript库,用于将汉字转换为拼音。 2. 该库**无任何外部依赖**,...

    JavaScript 宝典(第四版)及阅读器.rar

    同时,Node.js使得JavaScript能够在服务器端运行,实现了全栈开发的可能性。 在实际开发中,理解错误处理、性能优化、代码组织和测试也是提升代码质量的关键。学习并运用最佳实践,如模块化、代码复用和编写可维护...

Global site tag (gtag.js) - Google Analytics