`

CSSHttpRequest 使用记叙

 
阅读更多

首先介绍下这个东西,说白了它跟jsonp很相似,

Like JavaScript includes, this works because CSS is not subject to the same-origin policy that affects XMLHttpRequest. CSSHttpRequest functions similarly to JSONP, and is limited to making GET requests. Unlike JSONP, untrusted third-party JavaScript cannot execute in the context of the calling page.

 

加粗的这句话是说 不像 jsonp在上下文中不信任的第三方js文件不能被执行,这个我没想明白...

 

/* 
CSSHttpRequest
Copyright 2008 nb.io - http://nb.io/
Licensed under Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.html
*/

(function(){
    var chr = window.CSSHttpRequest = {};
    
    
    chr.id = 0;
    chr.requests = {};
    chr.MATCH_ORDINAL = /#c(\d+)/;
    chr.MATCH_URL = /url\("?data\:[^,]*,([^")]+)"?\)/;
    
    
    chr.get = function(url, callback) {
        var id = ++chr.id;
        var iframe = document.createElement( "iframe" );
        iframe.style.position = "absolute";
        iframe.style.left = iframe.style.top = "-1000px";
        iframe.style.width = iframe.style.height = 0;
        document.documentElement.appendChild(iframe);
        var r = chr.requests[id] = {
            id: id,
            iframe: iframe,
            document: iframe.contentDocument || iframe.contentWindow.document,
            callback: callback
        };
        
        r.document.open("text/html", false);
        r.document.write("<html><head>");
        r.document.write("<link rel='stylesheet' type='text/css' media='print, csshttprequest' href='" + chr.escapeHTML(url) + "' />");
        r.document.write("</head><body>");
        r.document.write("<script type='text/javascript'>");
        r.document.write("(function(){var w = window; var p = w.parent; p.CSSHttpRequest.sandbox(w); w.onload = function(){p.CSSHttpRequest.callback('" + id + "');};})();");
        r.document.write("</script>");
        r.document.write("</body></html>");
        r.document.close();
    };
    
    
    chr.sandbox = function(w) {
    };
        
    
    chr.callback = function(id) {
        var r = chr.requests[id];
        var data = chr.parse(r);
        r.callback(data);
        window.setTimeout(function() {
            var r = chr.requests[id];
            try { r.iframe.parentElement.removeChild(r.iframe); } catch(e) {};
            delete chr.requests[id];
        }, 0);
    };
    
    chr.parse = function(r) {
        var data = [];
        
        // Safari, IE and same-domain Firefox
        try {
            var rules = r.document.styleSheets[0].cssRules || r.document.styleSheets[0].rules;
            for(var i = 0; i < rules.length; i++) {
                try {
                    var r = rules.item ? rules.item(i) : rules[i];
                    var ord = r.selectorText.match(chr.MATCH_ORDINAL)[1];
                    var val = r.style.backgroundImage.match(chr.MATCH_URL)[1];
                    data[ord] = val;
                } catch(e) {}
            }
        }
        
        // catch same-domain exception
        catch(e) {
            r.document.getElementsByTagName("link")[0].setAttribute("media", "screen");
            var x = r.document.createElement("div");
            x.innerHTML = "foo";
            r.document.body.appendChild(x);
            var ord = 0;
            try {
                while(1) {
                    x.id = "c" + ord;
                    var style = r.document.defaultView.getComputedStyle(x, null);
                    var bg = style["background-image"] || style.backgroundImage || style.getPropertyValue("background-image");
                    var val = bg.match(chr.MATCH_URL)[1];
                    data[ord] = val;
                    ord++;
                }
            } catch(e) {}
        }
        
        return decodeURIComponent(data.join(""));
    };
    
    
    chr.escapeHTML = function(s) {
        return s.replace(/([<>&""''])/g,
            function(m, c) {
                switch(c) {
                    case "<": return "&lt;";
                    case ">": return "&gt;";
                    case "&": return "&amp;";
                    case '"': return "&quot;";
                    case "'": return "&apos;";
                }
                return c;
            });
    };
})();

 

上面是实现的源代码,这个需要后端的支持,比如PHP的后端

<?php
/**
 * CSSHttpRequest PHP Encoder
 *
 * @author Tim Akinbo <obnika@timakinbo.com>, Randy Reddig <ydnar@nb.io>
 * @version 1.2
 * @license http://www.apache.org/licenses/LICENSE-2.0.html Apache License 2.0
 * @copyright Copyright (c) 2008, Tim Akinbo
 */

define('PREFIX', "data:,");
define('LENGTH', 2000 - strlen(PREFIX)); # Internet Explorer 2KB URI limit (http://support.microsoft.com/kb/208427)

function encode($string) {
	$quoted = rawurlencode($string);
	$out = "";
	for ($i = 0, $n = 0; $i < strlen($quoted); $i += LENGTH, $n++) {
		$out .= "#c" . $n . "{background:url(" . PREFIX . substr($quoted, $i, LENGTH) . ");}\n";
	}
	return $out;
}

/* unit test */
if(STDIN) {
    $string = file_get_contents("php://stdin", "r");
    echo encode($string);
}

?>

 官网:

http://nb.io/hacks/csshttprequest

 

感觉还行,其实就是使用 dom元素的 url: data 的机制来实现的, dom这种功能还可以实现一种 本地存储的实现,有兴趣的可以试试

分享到:
评论
1 楼 vb2005xu 2013-04-08  
ajax 一个 gbk 目标后,如果内容出现乱码,说明服务器在送出内容时没有指定 charset,ajax 对于没有指定 charset 的 response 默认以 utf-8 来处理,所有出现乱码,本以为若目标不可控则此问题无解,无意中发现 xhr 对象的 overrideMimeType 方法居然可以强势修复这个问题,大大让我惊喜啊!

解决方法备注如下:

xhr.overrideMimeType( "text/html;charset=" + charset );

相关推荐

    爱的奉献_学习议论中的记叙.ppt课件.ppt

    在记叙文中,记叙的主要目标是让读者能够感受到事件的完整性和生动性,作者通常会使用丰富的细节和情感色彩,以便读者能够身临其境,被故事所感动。例如课件中提到的父亲的形象描绘,通过生动的比喻(生锈的大水壶)...

    2021-2022年收藏的精品资料中考记叙文考点解析及专题训练4——理清记叙顺序.docx

    - 典型题目:“本文使用了哪种记叙方法?有何作用?” - 变式题目:“某段落采用了何种记叙顺序?其作用是什么?” - “某段落采用了插叙手法,其作用为何?” #### 三、方法指导 1. **了解不同记叙顺序的特点**...

    英语记叙文阅读理解指导PPT课件.pptx

    【记叙文阅读理解指导】 在英语学习中,掌握记叙文的阅读理解是一项至关重要的技能。记叙文,以其叙述和描写的表达方式,主要讲述了人与事的故事,是文学作品中的常见文体。它通过具体的情节和形象来反映生活,传达...

    小学语文记叙文复习PPT课件.pptx

    小学语文记叙文复习PPT课件涵盖了记叙文的基础知识和常见题型及应答方法,对于理解和创作记叙文具有重要的指导价值。以下是详细的知识点解析: 1. 记叙文要素:时间、地点、人物、事件的起因、经过、结果是构成记叙...

    中职语文——记叙文写作教案[宣贯].ppt

    - 使用修饰语,突出主题或情节,引起读者兴趣。 6. **开头技巧**: - 悬念设置:激发读者的好奇心。 - 直接切入:开门见山,明确主题。 - 抒情引入:触动读者的情感。 - 引用名言:增加深度和内涵。 7. **...

    “爱的奉献”学习议论中的记叙教案教学设计(人教版高一必修三).docx

    - **辨别真伪**:核实事例的真实性,避免使用不准确或有争议的例子,以维护论证的可靠性。 4. **教学过程设计**: - **导入**:通过对比阅读,让学生感知议论文中的记叙与记叙文的区别。 - **知识讲解**:明确...

    记叙文是以记叙.doc

    【记叙文】是文学表达的一种重要形式,它主要通过记叙、描写的方式,叙述人物、事件、景色或物品,以此来传达作者的情感、观点和人生思考。新闻、通讯、游记、童话以及一些叙述性的散文都属于记叙文范畴。在中学生...

    一、记叙文写作:典型事例写人(3).pdf

    标题中提到的“记叙文写作:典型事例写人(3)”表明,这份文件可能是一系列关于如何撰写记叙文的教程或指导资料中的第三部分,专注于使用典型事例来描写人物的写作技巧。记叙文是一种常见的文体,主要通过叙述事情来...

    小学六年级毕业复习记叙文阅读答题技巧.pptx

    【小学六年级毕业复习记叙文阅读答题技巧】 在小学六年级毕业复习阶段,记叙文阅读是一项重要的技能。记叙文是以叙述、描写为主要表达方式,讲述人物、事件、场景的文章,通常包括时间、地点、人物、事件的起因、...

    记叙文标题的作用答题方法术语整理.doc

    2. **拟人**:标题中使用拟人手法可以赋予非生命体以生命力,增加文本的趣味性和感染力。 3. **夸张**:夸张手法可以使标题更加吸引人注意,增强表达力度。 4. **反问**:标题采用反问形式可以引起读者的好奇心,...

    记叙文基础知识.doc

    第二人称在叙述中较少使用,多用于直接抒情;第三人称则具有更广阔的叙述范围,能全面展示人物和事件。 记叙的顺序主要包括顺叙、倒叙和插叙。顺叙是按时间顺序叙述,易于理解;倒叙则是先揭示结果,再回溯过程,常...

    记叙文阅读记叙文文体知识梳理.doc

    《记叙文文体知识梳理》这篇文档是针对初中语文学习,特别是中考复习的重要参考资料,它详细阐述了记叙文这一文体的相关知识。记叙文是语文考试中的常见题型,理解并掌握其特点和写作技巧对于提升阅读理解能力至关...

    初中记叙文阅读教学有效性策略研究成果报告.doc

    【初中记叙文阅读教学有效性策略研究报告】 记叙文阅读教学是初中语文教育的重要组成部分,旨在提升学生的理解和表达能力,培养良好的阅读习惯和方法。然而,当前的教学实践中,存在一些问题,如学生阅读能力和表达...

    小学六年级毕业复习记叙文阅读答题技巧PPT学习教案.pptx

    记叙文是小学语文学习中的重要部分,它以记叙、描写为主要表达方式,通常涉及人物、事件、时间、地点等要素,通过故事来传达作者的思想和情感。以下是针对记叙文阅读的一些关键知识点: 1. **阅读策略**: - **先...

    英语记叙文写作PPT课件.pptx

    英语记叙文写作PPT课件.pptx

    专题二理清记叙文的线索及其作用.pdf

    【记叙文线索及其作用详解】 记叙文的线索是文章结构的核心,它如同一条丝线,将文章的各个部分紧密相连,形成一个完整的故事框架。通过对线索的把握,读者可以更好地理解文章的内容,梳理文章的层次,以及领悟文章...

    高中英语写作教程记叙文PPT课件.pptx

    - **举例**:使用"for example"、"such as"等来插入实例,增强叙述的生动性,如"first, second…"用于列举细节。 - **总结归纳**:用"in a word"、"in short"等短语进行总结,如"personally, I believe…"发表个人...

    记叙文阅读之记叙顺序及作用学生版.doc

    ### 记叙文阅读之记叙顺序及作用详解 #### 学习目标概述 本文旨在帮助学生深入理解记叙文的结构与特点,特别是不同记叙顺序及其在文本中的作用。学习目标包括: 1. 掌握记叙文的六大基本要素。 2. 能够区分并理解...

    1记叙文综述.ppt

    【标题】: 高考语文中的记叙文写作要点解析 【描述】: 高考语文写作要求符合文体,尤其注重记叙文和议论文的写作能力。近年来,高考作文多采用“三自”原则,给予考生更多自由度,但同时也要求考生熟练掌握各类文体...

    记叙文基础知识(知识点全包括).doc

    6. **记叙文的技巧**:使用象征、对照、衬托等表现手法和比喻、拟人、排比等修辞手法,可以增强文章的艺术效果。同时,准确生动的语言是记叙文魅力的关键。 总结来说,理解记叙文的基础知识,包括其定义、范围、...

Global site tag (gtag.js) - Google Analytics