Fdream's Blog
专注于WEB前端开发
Powered by Google
1 2 3 4 5 6 7
不安全的js写法
11 晴天 2009-9
Fdream 发表于 Ajax Web, 已被阅读 1099 次评论 0 条
关键词:javascript ajax

一种很常见的写法:

参考代码: [复制代码] [保存代码]

document.write('<scr'+'ipt src="http://a.com/b.js" type="text/javascript"></scr'+'ipt>');

直到被杀毒软件提示有恶意代码才发现这也是不安全的,汗……

那就只好改成这样了:

参考代码: [复制代码] [保存代码]

(function() {
    var s = document.createElement('script');
    s.type = 'text/javascript';
    s.src = 'http://a.com.cn/b.js';
    document.getElementsByTagName('head')[0].appendChild(s);
})();

大家可能看完性能测试才会有兴趣,下图是一个较全的性能测试结果,大家可以在这里测试,大家可以自己跑一跑看(由于加载的东西较多,请耐心等待一会儿再点start按钮)。

做这个的起因很简单:我喜欢用Google Chrome,又喜欢逛豆瓣Google Chrome支持User Scripts了,但是我写的那几个插件在Chrome下又跑不了。因为Google ChromeGoogle Gears,据说可以跨域Ajax,于是弄吧!结果越弄越复杂,因为Google Gears的跨域也是有很多限制的,看来还得服务器跑,还好有Google的App Engine,继续弄下去吧!

当然了,现在这个仅仅只是为Google Gears服务,写的很简单,不过还是比较“Ajax”的,看看简单的示例代码:

参考代码: [复制代码] [保存代码]

<script type="text/javascript" src="gears_init.js"></script>
<script type="text/javascript">
    var options = {
        'url': 'http://1986.appspot.com/', //你要请求的地址
        'method': 'GET'
    };
    
    var workerPool = google.gears.factory.create('beta.workerpool');

    workerPool.onmessage = function(a, b, message) {
        //alert('received: ' + message.body);
        document.write(message.body);
    };

    var childWorkerId = workerPool.createWorkerFromUrl('http://ajaxproxy.appspot.com/gears/gears_proxy.js');
    workerPool.sendMessage(options, childWorkerId);
</script>

后续的计划,起码也要实现JSONP吧,这个运用得还是非常广泛的。

先废话几句,这第23篇教程一直没有翻译出来,直到今天我看到待审评论里面有这么一条超长的评论,结果一看,居然是这篇教程的翻译稿。这位热心的Mootools爱好者是Fanhp,非常感谢你的辛勤劳动!同时,我感到非常羞愧,实在是有愧大家的期望!愧疚是要拿行动来补的,于是我赶紧对此篇翻译进行了一些整理,修改了其中部分词句,并整理了示例代码。

------------------------

如果你还没有准备好开始这一讲,请参考这一系列的教程,这里是《MooTools 1.2系列教程目录》

今天继续我们的Mootools 1.2教程的第23课,我们今天来讲一下Fx插件中的Fx.Slide。通过该插件,可以让你把内容以滑动的方式显示出来。它使用起来非常简单,是你UI工具箱中一个很好的工具。

基本用法

就像我们前面看过的所有类一样,我们在把这个类应用到一个元素上面时,我们要做的第一件事就是初始化一个新的Fx.Slide实例。

首先,让我们为滑动元素建立一个HTML文件。

参考代码: [复制代码] [保存代码]

<div id="slide_element" class="slide">这里是要滑动显示的内容。</div>

继续Mootools的扩展,适用于Mootools 1.1及1.2,这次在Element扩展了两个非常简单的方法,一个用来获取或者设置一个元素的innerHTML(这个是模仿jQuery里面的html()方法),还一个方法是把一个表单对象转成hash对象,用得比较少一点。

方法:html

说明:当参数不为空时,设置一个元素的innerHTML,当参数为空时,返回当前元素的innerHTML。

参考代码: [复制代码] [保存代码]

Element.implement({
    html: function(s) {
        ///<summary>
        /// 获取元素的HTML内容或者设置元素的HTML内容
        ///</summary>
        ///<param name="s" type="String">参数为空时,获取HTML内容;参数为字符串时,设置HTML的内容</param>
        ///<returns type="String" />
        if (s === undefined) {
            return this.get('html');
        }
        else {
            this.set('html', s + '');
            return s;
        }
    }
});

继续Mootools常用方法扩展,这次是Window类上的扩展,也就是全局函数。

方法:$params

说明:获取页面URL参数。你可以使用任何指定的分隔符,比如'#',默认为'#'。

参考代码: [复制代码] [保存代码]

Window.implement({
    $params: function(delimiter) {
        ///<summary>
        /// 获取页面URL的参数,返回包含参数的hash对象
        ///</summary>
        ///<param name="delimiter" type="String">参数和URL的分隔符,比如?或者#,默认为#</param>
        ///<returns type="Hash" />
        delimiter = (delimiter || '#').escapeRegExp();
        var params = new Hash();
        try {
            var requestStr = (location.toString().match(new RegExp(delimiter + '(.+)$')) || [0, 0])[1];
            if (requestStr) {
                params = requestStr.toHash(true);
            }
        }
        catch (e) {
        }
        return params;
    }
}

方法:$dump

说明:类似于PHP中的var_dump方法,打印指定的变量或者对象的内容,返回描述变量内容的字符串...

我们先看一下JavaScript中关系运算符的类型转换规则:

引用内容:

关系运算符(<、>、<=、>=)

  • 试图将 expression1 和 expression2 都转换为数字。
  • 如果两表达式均为字符串,则按字典序进行字符串比较。
  • 如果其中一个表达式为 NaN,返回 false。
  • 负零等于正零。
  • 负无穷小于包括其本身在内的任何数。
  • 正无穷大于包括其本身在内的任何数。

所以很容易理解下面这样的比较:

参考代码: [复制代码] [保存代码]

1 < NaN: false
1 >= NaN: false

'a' < 1: false
'a' >= 1: false

jQuery居然都没有JSON的decode和encode,精确类型判断也没有,囧……自己动手写吧!不过这些东西在网上都已经有很好的版本了,自己也不用太费脑筋,拿来用吧!类型判断在这里有一段很好的代码:http://lucassmith.name/pub/typeof.html,JSON的decode和encode就直接用Mootools的吧!(不过Mootools里面的JSON.encode方法还不够完美,我作了一些完善。)

参考代码: [复制代码] [保存代码]

/**
* extension of JSON, type for jQuery
* AUTHOR: xushengs@gmail.com
* LICENSE: http://www.opensource.org/licenses/mit-license.php
* WEBSITE: http://ooboy.net/
*/
(function($) {
    // the code of this function is from 
    // http://lucassmith.name/pub/typeof.html
    $.type = function(o) {
        var _toS = Object.prototype.toString;
        var _types = {
            'undefined': 'undefined',
            'number': 'number',
            'boolean': 'boolean',
            'string': 'string',
            '[object Function]': 'function',
            '[object RegExp]': 'regexp',
            '[object Array]': 'array',
            '[object Date]': 'date',
            '[object Error]': 'error'
        };

        return _types[typeof o] || _types[_toS.call(o)] || (o ? 'object' : 'null');
    };
    // 剩下的代码请进入全文查看
})(jQuery);

1 2 3 4 5 6 7
Copyright © 2005-2008,Fdream All Rights Reserved
Processed in 0.3593612 second(s) , unknow queries
Powered by OWord V0.1, Even Not Alpha
(此博客程序为半成品,请勿索取,以免给您的心灵造成创伤^_^)
鄂ICP备05026031号