•     今天刚刚一周年,回首往事总是觉得是快的,不管这一年经历了什么,在浅层记忆中总是会觉得快乐的。呵呵。一年可以让人变得浮躁,因为这一年中你在工作上的成长肯定是飞快的(除非你没有认证对待它)。会让人觉得似乎这份工作对我来说已经没有什么挑战了,变得无趣了。这样不好,哈哈。

        希望快点升职加薪,其实也不一定要升职啦,加薪就行了。

     master乌龟说:yesterday is history, tomorrow is mystery, today is a gift, that is why it is called the "present"..

  • 有了actionscript3,有许多不可思议的图片操作都可以实现。能把flash中的显示对象转换成一张jpeg图片就是其中之一,这要感谢在AS3 Core Library(一个as3开源库)中所提供的JPEG格式编译类,有了它,要实现前面的那个构想将变得十分简单。在下文中,我将向你展示如何编写一个flash,使他能够把movieclip转换为一张jpeg图片并可以下载到用户电脑。

    为了给你一个程序的大体概念,请试试下面的这个画图板。

     

     

    首先要做的重要准备

    在我们开始之前,取保你已经下载了ActionScript 3 Core Library。这个核心库包涵了许多类和功能模块,他们提供了诸如MD5,日期格式化,图像编码等功能(这里只列举了其中几个)。当你获得了这个库之后,你只需要把它放到你的类文件夹中,就可以使用它提供的这些功能了。现在我们可以导入JPGEncoder这个类了。

     
    import com.adobe.images.JPGEncoder;
     

    编译一个MovieClip

           在这个例子中,我们假设我们感兴趣的那个MovieClip名为sketch_mc,为了能使用JPGEncoder进行操作,我们需要先把MovieClip转换为一个Bitmap对象。要实现这一步,我们将使用到BitmapData这个类。该类的构造函数需要两个参数,宽和高。因为我们想要这张jpeg图片的大小和sketch_mc的大小一样,所以我们用sketch_mc的宽高属性。然后通过传递sketch_mc参数给draw方法,我们的MovieClip就转换为一个Bitmap对象了。

     
    import com.adobe.images.JPGEncoder;
     
    var jpgSource:BitmapData = new BitmapData (sketch_mc.width, sketch_mc.height);
    jpgSource.draw(sketch_mc);
     

    现在sketch_mc的图像已经有位图实例了,我们就可以使用JPGEncoder了。在创建这个类的一个新实例的时候,你可以通过传递1-100的数字参数来设置图片压缩的等级。接下来我们来创建jpeg图片,调用encode方法,并且把上面的位图实例作为参数传递进去。该方法将以ByteArray的数据格式返回jpeg,可见这个类和AS3中其他操作二进制数据的类一样简单方便。

     

    import com.adobe.images.JPGEncoder;

    var jpgSource:BitmapData = new BitmapData (sketch_mc.width, sketch_mc.height);
    jpgSource.draw(sketch_mc);

    var jpgEncoder:JPGEncoder = new JPGEncoder(85);
    var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
     

    Flash Player到硬盘

           ActionScript 3已经完成了所有将MovieClip转换为jpeg的必要工作,但是现在还需要一些小步骤来实习图片的下载。为此我们需要用URLRequest这个类把我们得到的二进制数据传递给服务器端的脚步。因为我们post的是二进制数据,所以必须设置content-type“application/octet-stream”。当然,当图片被下载的时候它还需要一个名字,所以我们同样需要把这个参数作为查询字符床也传递给服务器端的脚步。


    import com.adobe.images.JPGEncoder;

    var jpgSource:BitmapData = new BitmapData (sketch_mc.width, sketch_mc.height);
    jpgSource.draw(sketch_mc);

    var jpgEncoder:JPGEncoder = new JPGEncoder(85);
    var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);

    var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
    var jpgURLRequest:URLRequest = new URLRequest("jpg_encoder_download.php?name=sketch.jpg");
    jpgURLRequest.requestHeaders.push(header);
    jpgURLRequest.method = URLRequestMethod.POST;
    jpgURLRequest.data = jpgStream;
    navigateToURL(jpgURLRequest, "_blank");

     

    下面是我们的jpg数据将要post去的php页面的脚步。我选择php作为例子,但其实任何服务器端的脚步都是可以的。

    if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
    {
              // get bytearray
              $jpg = $GLOBALS["HTTP_RAW_POST_DATA"];

              // add headers for download dialog-box
              header(’Content-Type: image/jpeg’);
              header(”Content-Disposition: attachment; filename=”.$_GET['name']);
              echo $jpg;
    }
  • 1、给DOM对象添加的属性是一个对象的引用。
    范例:    
    var MyObject = {};    
    document.getElementById('myDiv').myProp = MyObject;    
    解决方法:    
    在window.onunload事件中写上: document.getElementById('myDiv').myProp = null;    
      
      
    2、DOM对象与JS对象相互引用。
    范例:    
    function Encapsulator(element) {    
      this.elementReference = element;    
      element.myProp = this;    
    }    
    new  Encapsulator(document.getElementById('myDiv'));    
    解决方法:    
    在onunload事件中写上: document.getElementById('myDiv').myProp = null;    
      
      
    3、给DOM对象用attachEvent绑定事件。
    范例:    
    function doClick() {}    
    element.attachEvent("onclick", doClick);    
    解决方法:    
    在onunload事件中写上: element.detachEvent('onclick', doClick);    
      
      
    4、从外到内执行appendChild。这时即使调用removeChild也无法释放。
    范例:    
    var parentDiv =  document.createElement("div");    
    var childDiv = document.createElement("div");    
    document.body.appendChild(parentDiv);    
    parentDiv.appendChild(childDiv);    
    解决方法:    
    从内到外执行appendChild:    
    var parentDiv =  document.createElement("div");    
    var childDiv = document.createElement("div");    
    parentDiv.appendChild(childDiv);    
    document.body.appendChild(parentDiv);    
      
      
    5、反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。
    范例:    
    for(i = 0; i < 5000; i++) {    
      hostElement.text = "asdfasdfasdf";    
    }    
    这种方式相当于定义了5000个属性!    
    解决方法:    
    其实没什么解决方法:P~~~就是编程的时候尽量避免出现这种情况咯~~    
      
      
    说明:    
    1、以上资料均来源于微软官方的MSDN站点,链接地址:    
    http://msdn.microsoft.com/librar ... e_leak_patterns.asp    
    大家可以到上面这个地址中看到详细的说明,包括范例和图例都有。只是我英文不太好,看不太懂,如果我上述有失误或有需要补充的地方请大家指出。    
      
    2、对于第一条,事实上包括 element.onclick = funcRef 这种写法也算在其中,因为这也是一个对对象的引用。在页面onunload时应该释放掉。    
      
    3、对于第三条,在MSDN的英文说明中好像是说即使调用detachEvent也无法释放内存,因为在attachEvent的时候就已经造成内存“LEAK”了,不过detachEvent后情况还是会好一点。不知道是不是这样,请英文好的亲能够指出。    
      
    4、在实际编程中,这些内存问题的实际影响并不大,尤其是给客户使用时,客户对此绝不会有察觉,然而这些问题对于程序员来说却始终是个心病 --- 有这样的BUG心里总会觉得不舒服吧?能解决则给与解决,这样是最好的。事实上我在webfx.eae.net这样顶级的JS源码站点中,在它们的源码里都会看到采用上述解决方式进行内存的释放管理。  
  • 【原文】:http://javascript.crockford.com/memory/leak.html

    【译文】:

    JScript的内存泄漏

    当一个系统不能正确的管理他的内存分配时,这个系统就存在内存泄漏,这对系统来说是一个bug。内存泄漏的现象可以有程序调用失败、执行减慢等。

    微软的Internet Explorer就存在一系列的内存泄漏,其中最严重的就算是执行Jscript时产生的泄漏。当一个DOM对象包涵有一个JavaScript对象(例如一个事件处理函数)的引用,同时如果这个JavaScript对象又包涵该DOM对象,那么这个循环引用就形成了。这种结构本质上没有问题。此时,因为该DOM对象和这个事件处理函数并没有别的引用存在,那么垃圾回收器(一种自动的内存资源管理器)本应该把它们都回收点,并内存释放。JavaScript的垃圾回收器能够检测到这种循环引用,并不会对他产生困惑。但是不幸的是,IE DOM的内存并不能被Jscript所管理。他有他自己的内存管理系统,然而这套系统并不知道循环引用,使得一切都变得混乱。这就导致了,当循环引用形成的时候,内存释放工作不能完成,也就是产生了内存泄漏。长时间的内存泄漏就将产生内存的匮乏,使得浏览器因缺乏必要内存而崩溃?

    我们可以来演示一下。在第一段程序-question1中,我们将动态创建以10个为一组共计10000个的DOM元素(<span>),创建10个然后删除在创建10个,如此循环。你在运行这段程序时打开Windows任务管理器,就可以观察到页面运行时PF(虚拟内存)使用率一直保持不变。PF使用率的变化可以视为内存分配是否无效的指标。

     

    Question1

    <html>
        <head>
            <title>Queue Test 1</title>
        </head>
        <body>
            <script>
                /*global setTimeout */
                (function (limit, delay) {
                    var queue = new Array(10);
                    var n = 0;
     
                    function makeSpan(n) {
                        var s = document.createElement('span');
                        document.body.appendChild(s);
                        var t = document.createTextNode(' ' + n);
                        s.appendChild(t);
                        return s;
                    }
     
                    function process(n) {
                        queue.push(makeSpan(n));
                        var s = queue.shift();
                        if (s) {
                            s.parentNode.removeChild(s);
                        }
                    }
     
                    function loop() {
                        if (n < limit) {
                            process(n);
                            n += 1;
                            setTimeout(loop, delay);
                        }
                    }
     
                    loop();
                })(10000, 10);
            </script>
        </body>
    </html>
     

    接下来我们运行第二段程序queuetest2。除了做与queuetest1相同的事情以外,它还未每个元素添加了一个点击事件响应函数。在MozilaOpera上,虚拟PF利用率和queuetest1是一样的,但是在IE上我们可以看见由于内存泄漏而产生的每秒一兆的虚拟内存的稳定增量,通常这种泄露都不会被注意到。但是由于Ajax的日益流行,使得页面在浏览器的停留时间增长,使得问题变得常见了。

    Question2

    <html>

        <head><title>Queue Test 2</title>

        </head>

        <body>

            <script>

                /*global setTimeout */

                (function (limit, delay) {

                    var queue = new Array(10);

                    var n = 0;

     

                    function makeSpan(n) {

                        var s = document.createElement('span');

                        document.body.appendChild(s);

                        var t = document.createTextNode(' ' + n);

                        s.appendChild(t);

                        s.onclick = function (e) {

                            s.style.backgroundColor = 'red';

                            alert(n);

                        };

                        return s;

                    }

     

                    function process(n) {

                        queue.push(makeSpan(n));

                        var s = queue.shift();

                        if (s) {

                            s.parentNode.removeChild(s);

                        }

                    }

     

                    function loop() {

                        if (n < limit) {

                            process(n);

                            n += 1;

                            setTimeout(loop, delay);

                        }

                    }

     

                    loop();

                })(10000, 10);

            </script>

        </body>

    </html>

     

    因为IE不能对循环引用进行回收,所以这个任务就落在了我们的肩上。如果我们明确的打破这个循环引用,那么IE就能够完成垃圾回收工作了。具微软的解释,引起内存泄漏的原因是闭包,然而这个结论肯定是非常错误的,并且这使得微软给开发者的建议也成了错误的建议。那么通过DOM来打破循环引用更简单,因为实际上不可能通过Jscript来实现。

    当我们处理完一个元素后,我们必须通过把它所有的事件处理函数制空来达到破坏循环引用的目的。我们所需要做的就是把每个事件的处理函数设为空就可以了。我们甚至可以清理函数来完成这一工作。

    清理函数将保存一份DOM元素的引用。它将循环检测这个元素的所有属性。如果发现了时间处理函数,就把它值为空。这样就破坏了循环引用,使得内存可以被回收释放。它同样也会检测该元素的子元素,打破他们的循环引用。这个清理函数,只在IE中有效果,对于MozillaOpera都无效。不管是用removeChild()或者是设置innerHTML属性的值,都应该在删除元素之前调用清理函数。

    function purge(d) {
        var a = d.attributes, i, l, n;
        if (a) {
            l = a.length;
            for (i = 0; i < l; i += 1) {
                n = a[i].name;
                if (typeof d[n] === 'function') {
                    d[n] = null;
                }
            }
        }
        a = d.childNodes;
        if (a) {
            l = a.length;
            for (i = 0; i < l; i += 1) {
                purge(d.childNodes[i]);
            }
        }
    }
    那么我们现在来运新第3个程序,queuetest3,在程序3里,元素在被删除之前都调用了清理函数。

    Question3

    <html>

        <head><title>Queue Test 3</title>

        </head>

        <body>

            <p>

                Queue Test 3 adds an event handler to each span, and removes it when

    finished. See <a href="http://www.crockford.com/javascript/memory/leak.html">http://www.crockford.com/javascript/memory/leak.html</a>

            </p>

            <script>

                /*global onunload, setTimeout */

                (function (limit, delay) {

                    var queue = new Array(10);

                    var n = 0;

     

                    function makeSpan(n) {

                        var s = document.createElement('span');

                        document.body.appendChild(s);

                        var t = document.createTextNode(' ' + n);

                        s.appendChild(t);

                        s.onclick = function (e) {

                            s.style.backgroundColor = 'red';

                            alert(n);

                        };

                        return s;

                    }

     

                    function purge(d) {

                        var a = d.attributes, i, l, n;

                        if (a) {

                            l = a.length;

                            for (i = 0; i < l; i += 1) {

                                n = a[i].name;

                                if (typeof d[n] === 'function') {

                                    d[n] = null;

                                }

                            }

                        }

                        a = d.childNodes;

                        if (a) {

                            l = a.length;

                            for (i = 0; i < l; i += 1) {

                                purge(d.childNodes[i]);

                            }

                        }

                    }

     

                    function process(n) {

                        queue.push(makeSpan(n));

                        var s = queue.shift();

                        if (s) {

                            purge(s);

                            s.parentNode.removeChild(s);

                        }

                    }

     

                    function loop() {

                        if (n < limit) {

                            process(n);

                            n += 1;

                            setTimeout(loop, delay);

                        }

                    }

                    onunload = function (e) {

                        purge(document.body);

                    };

     

                    loop();

                })(10000, 10);

            </script>

        </body>

    </html>

     

    更新:微软发布了该问题的补丁:929874。如果你有十足的信心确保你所有的用户都可以获得该更新,那么你将不再需要上面的清理函数。但不幸的是,这不可能如你所愿,所以可能清理工作在IE6被淘汰之前还是有必要的。

    这就是web的天性,有清理不完的bugs

     

  • 我遇到几个人,都问我知不知道要洗14寸的相片要多少像素才够,因为自己也不是经常洗相片,所以前段时间洗的时候才去了解清楚了。平时我们所说的4R其实就是6寸照,只要你的照片清晰,那么200W像素已经够了,除非你的相片不清晰,那么像素越大,缩小后当然效果自然会变好些。所以现在一般的数码相机好像都差不多600W,好多手机都500W啦~4R没问题,如果清洗放大到6R(8寸)都没问题。下面转贴一下数码冲洗的常识。

     小常识:通常表示照片规格会用“寸”来表示,和显示器之类的产品用对角线长度表示尺寸的方式不同,照片所说 的“几寸”是指照片长的一边的英寸长度。比如6寸照片,就是指规格为6×4英寸的照片。而国际上还有一种通行的表示照片尺寸的方法,即取照片短的一边的英 寸整数数值加字母R来表示。比如6寸照片,规格为6×4英寸,即4R。

    一、家用数码冲印参考

         为节省存储卡空间,大部分数码相机都会提供多种相片拍摄质量供用户选择。主要分为 Best(最佳质量)、Good(良好质量)及Normal(普通质量)。其区别是把拍摄后的JPEG相片按不同程度进行压缩。但过分压缩会严重影响相片 冲印质量。所以后两者拍出的相片未必真正适合冲印。在把相片拿去冲印前,用户最好先检查清楚冲印后的相片质量与拍摄到的影像文件是否成比例。要确保冲印效 果令人满意,大家可参考下表。
     

    冲印尺寸(英寸)    文件体积(约) 要求最低分辨率     相片对应尺寸
    (1寸 / 2寸)      150-200KB     640x480(30万)      2.5 × 3.5 cm  / 5.3 × 3.5cm 
    (5×3.5英寸)3R    500-550KB    1280x960(120万)   12.70×8.89  cm
    (6×4英寸)  4R    600-650KB    1280x1024(130万)  15.24×10.16 cm
    (7×5英寸)  5R    800-900KB    1600x1200(200万)  17.78×12.70 cm
    (8×6英寸)  6R    1-1.2MB      1900x1280(240万)  20.32×15.24 cm
    (10×8英寸) 8R-8F 1.3-1.5MB    2048x1536(300万)  25.40×20.32 cm

    注:其它尺寸请参考表2

        以上数字是最基本要求,拍摄质量越高及文件越大,冲印相片的效果越好。用户如果要经常冲印数码相片,最好先检查相片是否符合上述要求。笔者个人的建议是拍摄时尽量选用“最佳质量”以减少相片细节损耗和确保冲印效果良好。

        另外,用户也可根据以下公式,计算正确的数码相片输出尺寸大小。

            拍摄分辨率÷300dpi=输出尺寸

        举个例,假设拍摄的相片是150万像素(1024x1536),就把1024及1536各除以300,得出3.5寸x5寸(即3R尺寸)。即是说,150万像素的数码相片冲印的最大极限是3R,以此类推。

    参考:
    家庭 4R 相片所用的推荐像素:
    1.200万像素已经可以冲印出较理解的相片
    2.300万像素这是个不错的选择,即保证了像素,文件又不是很大(推荐)
    3.400万和500万像素拍摄
    4.再大的像素对冲印质量影响不大(文件太大洗相馆也会帮你裁了),但文件尺寸会很大,如果相机内存卡很充足和家里电脑硬盘很大就使用该相机所能拍摄的最高像素.


    二、相片长宽比例 
        由 于CCD感光器件尺寸的限制,大部分数码相片的长宽比例是4:3,而一般3R相片比例是5:3.5、4R则是3:2。若按比例冲印,相片会出现白边或部分 影像会被裁掉。有的人说,我可以预先在计算机中对相片长宽比例进行裁切,但笔者并不建议这样做,因为这是很花时间的。权宜之计是拍摄时在影像边缘位置预留 5至8空间,就能够避免上述问题。

        当然,如果你觉得自己剪裁相片更为准确,知名图形编辑软件Photoshop内置的Crop裁剪工具能帮到你。只需在工具选项输入合适比例,例如3.5寸x5寸,裁切工具就会依照用户提供的比例进行相片剪切。 

        据我所知现在很多洗相馆应数码相机潮流可以冲印4:3的相片,即不用裁剪即可,那么6寸的相片实际上就是 6 X 4.5英寸(15.2 X 11.4厘米),相对于4R的相片而不载剪的4:3称之为4D尺寸,也相应有对应4D尺寸的相薄配送/卖,洗相前可以多了解一下你所在地的相馆可洗的实际尺寸与价格, 这里可以参考一下本地百佳冲印的价格: 4D比4R贵一角钱 4D光面8角,磨沙面9角,4D光面+过朔=1元/张,各地的价格有所差别。

    三、用软件修饰相片 

        在 把相片交到冲印店或直接利用打印机打印之前,适当地利用软件调整相片明暗 、反差、对比度与色彩鲜艳度有助于提高相片的可观赏性。笔者有一个小技巧 提 供,即在Photoshop中利用“Levels”(Ctrl L)把两边角修整至Histogram两端,相片的明暗、反差与整体色调都会有明显改 善。此外,你还可以选择“Auto Levels”或“Auto Color”功能,也能对影像质量与色调调整有帮助。 


    四、给冲印店的清晰指示 
        一般情况下,数码激光冲印店会用计算机自动调整相片亮度和CMYK四色调。用户 
    可从冲洗好的相片背后编码了解冲印店是否为相片进行过校色,若出现“NNNN” 
    字样,即表示冲印员觉得无须调整。但一般而言,适当的校色有助于提供相片的 
    观赏性。

    五、附表

    冲印照片最大尺寸对照 表1 

    附:转贴著名摄影艺术网站《色影无忌》“血色黄昏”网友提供的数码相机和可冲印照片最大尺寸对照表

    根据150PPI计算的数码相机可冲洗最大照片的数据对照表(英寸)
    500万像素 有效4915200,像素2560X1920。可冲洗照片尺寸17X13,对角线21寸
    400万像素 有效3871488,像素2272X1704。可冲洗照片尺寸15X11,对角线19寸
    300万像素 有效3145728,像素2048X1536。可冲洗照片尺寸14X10,对角线17寸
    200万像素 有效1920000,像素1600X1200。可冲洗照片尺寸11X8,对角线13寸
    130万像素 有效1228800,像素1280X960。可冲洗照片尺寸9X6,对角线11寸
    080万像素 有效786432,像素1024X768。可冲洗照片尺寸7X5,对角线9寸
    050万像素 有效480000,像素800X600。可冲洗照片尺寸5X4,对角线7寸
    030万像素 有效307200,像素640X480。可冲洗照片尺寸4X3,对角线5寸

    由上表可以看出:
    5寸照片(3X5),采用800X600分辨率就可以了
    6寸照片(4X6),采用1024X768分辨率
    7寸照片(5X7),采用1024X768分辨率
    8寸照片(6X9),采用1280X960分辨率

    绿色:很好 黄色:好 土黄色:一般


    相片尺寸:表2

    1×1.5 英寸: 一寸 2.5×3.5(厘米) ; 小一寸 2.2×3.2(厘米) ; 大一寸 3.3×4.8(厘米) 
    1.5×2 英寸: 二寸 3.5×4.9(厘米) ; 小二寸 3.5×4.5(厘米) ; 大二寸 3.5×5.3(厘米) 

      1寸 1R              2.6×3.7(厘米)
      2寸 2R              6.3×8.9(厘米)
    5×3.5(5英寸 3R)   12.70×8.89 (厘米)
    6×4  (6英寸 4R)   15.24×10.16 (厘米)
    7×5  (7英寸 5R)   17.78×12.70 (厘米)
    8×6  (8英寸 6R)   20.32×15.24 (厘米)
    10×8 (10英寸 8R)  25.40×20.32 (厘米)
    12×10(12英寸)    30.48×25.40 (厘米)
    14×12(14英寸)    35.56×30.48 (厘米)
    16×12(16英寸)    40.64×30.48 (厘米)
    18×12(18英寸)      45.72×30.48 (厘米) 
    18×14(18英寸)    45.72×35.56 (厘米)
    20×16(20英寸)    50.80×40.64 (厘米)
    20×18(20英寸)      50.80×45.72 (厘米)
    24×20(24英寸)    60.96×50.80 (厘米)
    30×24(30英寸)    76.20×60.96 (厘米)
    32×24(32英寸)      81.28×60.96 (厘米) 
    36×24(36英寸)    91.44×60.96 (厘米)
    40×32(40英寸)      101.6×81.28 (厘米) 
    42×32(42英寸)      106.6×81.28 (厘米) 
    48×32(48英寸)      121.9×81.28 (厘米)
     

  • 2008-06-17

    囧rz - [life生活]

    岁月如箭,时光如梭,转眼间离上一篇文章的更新日期2008-02-24已经过了快4个月了,4个月的时光在岁月的银河中微如一粒尘埃,但在人生短暂的潮浪中却可以是一颗闪耀的星星。不得不再次感慨在浩渺的宇宙面前生命是的渺小。囧rz
    因为稀饭上摄影了,去买了台DSLR,果然拍的小SS很美
    等照片丰富了,就在这里贴出来,哇咔咔~

  • 2008-02-24

    春熙路刀客 - [转载]

    http://tieba.baidu.com/f?kz=226920137
     什么都不用说,看了就知道了。。。
  • 当你的弹出窗口被IE拦截后你该怎么办?
    很早以前用GMail的时候就发下,GMail会在他的弹出窗被拦截的时候提示用户,如果需要使用改功能请暂时允许弹出窗。很想把它的代码找到,可是去GMail的js里面找东西似乎不是一件什么好事。昨天用yahoo!mail的时候又遇到了。郁闷了。因为去Yahoo的js中找东西同样不是一个主意。
    自己想咯,结果静下来一下,其实很简单。。。。。
    <script>
        /*......*/
        var handle=window.open('.......');
        if(!handle){
            alert('我们的窗口被拦啦~~~')
        }
    </script>
    that's it....
    呵呵~

  • 来自:http://www.machinetown.cn/?p=163

    《JSONP》

    浏览器的安全机制使得XMLHttpRequest,iframe之类的控件不能进行跨域访问,从安全的角度讲,这也倒是无可厚非的事情,但是它的确限制了分布式web应用。

    要解决跨域访问限制带来的问题,通常我们有3种策略:
    本地服务器代理,flash,script标签

    我这里提出一种新的非标准方法用script实现跨域访问:JSON with Padding, or simply JSONP

    JSONP工作方式很简单,但是需要服务器的支持。首先要由客户端提交一段json格式的文本,然后你将其用小括号包起来,从而得到一个合法的js文档(也可能仅仅是一个js函数请求).

    客户端将jsonp关键字加入到请求文本的前面。
    很简单,通过一个空 的jsonp参数,返回的结果就是通过小括号包起来的json数据。

    让我们看看del.icio.us JSON API 的例子:

    例子中使用的script标签的src属性是这样的:
    http://del.icio.us/feeds/json/bob/mochikit+interpreter
    得到的结果:
    if(typeof(Delicious) == ‘undefined’) Delicious = {};
    Delicious.posts = [{
    “u”: “http://mochikit.com/examples/interpreter/index.html”,
    “d”: “Interpreter - JavaScript Interactive Interpreter”,
    “t”: [
    “mochikit”,”webdev”,”tool”,”tools”,
    “javascript”,”interactive”,”interpreter”,”repl”
    ]
    }]

    按照JSONP,上面的请求在语义上等同于下面的URL:
    http://del.icio.us/feeds/json/bob/mochikit+interpreter?jsonp=if(typeof(Delicious)%3D%3D%27undefined%27)Delicious%3D%7B%7D%3BDelicious.posts%3D

    这个uRL本身没什么意思,不过如果我们想要知道什么时候文档可用的时候呢?下面用过例子来跟踪一下:

    var delicious_callbacks = {};
    function getDelicious(callback, url) {
    var uid = (new Date()).getTime();
    delicious_callbacks[uid] = function () {
    delete delicious_callbacks[uid];
    callback();
    };
    url += “?jsonp=” + encodeURIComponent(”delicious_callbacks[” + uid + “]”);
    // add the script tag to the document, cross fingers
    };

    getDelicious(doSomething, “http://del.icio.us/feeds/json/bob/mochikit+interpreter”);

    这个试验中的URL是类似这样的:
    http://del.icio.us/feeds/json/bob/mochikit+interpreter?jsonp=delicious_callbacks%5B12345%5D

    delicious_callbacks[12345]([{
    “u”: “http://mochikit.com/examples/interpreter/index.html”,
    “d”: “Interpreter - JavaScript Interactive Interpreter”,
    “t”: [
    “mochikit”,”webdev”,”tool”,”tools”,
    “javascript”,”interactive”,”interpreter”,”repl”
    ]
    }])

    看看,因为我们使用了圆括号,所以JSONP请求能够传入到函数中。

    ps:我在官方文档中看到的参数不是jsonp,而是callback,Yahoo !Map中用的也是callback

  • 1John Carmack(约翰.卡马克)
    John是程序员的教父.他一直致力与推翻世界快速工业化的障碍,在引领时代浪尖的同时仍能将研究成果作为游戏的一部分,它的贡献令人敬畏.他在计算机图形方面的创新给我们带来了Wolfenstein 3D, Doom & Quake.

    2Linus TorvaldsLinus Torvalds
    Linux
    之父,他想为PC创造一个类似于Unix的操作系统,不仅实现了这个目标,并为软件带来了创造性的革命——开源。

    3Tim Berners-Lee(蒂姆·伯纳斯·李)
     World Wide Web
    的发明人,他为互联网带来的东西影响了全世界的人民。

    4Douglas Andrew Bell
    他开发了知名的游戏:Dungeon Master ,并将RPG游戏带入了一个新的时代.尽管这么多年以来图形技术已经有了长足的进步,但成千上万的游戏仍在复制他在1987年创立的存盘制(inventory system). 

    5Dennis Ritchie(丹尼斯·里奇)C语言之父!Dennis Ritchie对许多领域都深有研究,包括:C, ALTRAN, B, BCPLUnix.C方面他尤其产生了重大的影响,他与Brian Kernighan合著的书:The C Programming Language无疑是历史上最好的编程书籍.

    6Bram Cohen(布拉姆·科恩)
    BitTorrent
    技术之父!Bram编写了BitTorrent协议允许文件共享。如今这项技术正应用在互联网的各个角落。

    7Rasmus Lerdorf, Andi Gutmans & Zeev Suraski
    PHP
    之父!如今PHP已运行于互联网上34%的网页。
    Rasmus Lerdorf

    Andi Gutmans

    Zeev Suraski

    8
    Jez San
    Argonaut
    的创始人,即使位居高管仍致力于编程,他的代码常凭借在编程前沿技术的突破令人眼前一亮|

    9Bjarne Stroustrup
    C++之父。没有他从CC++引领的这一步,我们会怎么样呢?


    10
    Richard BartleRoy Trubshaw
    他们一起编写了第一个在线多人联机游戏。 第一个 MUD (多用户层面),在埃塞克斯大学写成,后成为用户在网络中交流的一种方式,是Internet文化的一部分。

    Richard Bartle
    Roy Trubshaw【文:呐不喊】@CSDN