Hpyer 的未知空间

国家/州/市及省/市/区三级联动JS代码

Posted by Hpyer on 星期一, 三月 26th, 2012

最近做项目要用到城市三级联动的JS程序,但是本人手头只有之前从扣扣上取得的脚本,然而这个脚本的数据是全世界城市的,而项目则需要国内的城市,且需要详细到县市区的,显然原来的数据不适合。 在询问了许久的谷歌和度娘后,终于找到了一份比较全的国内省市区的数据,按照原来数据的格式将其修改成了进行修正,以让现有的脚本可以完美的支持。 这样以来,只要让不同的项目读取所需的数据即可,足以满足日常的应用。 然而有时我们可能需要将城市信息直接输出,而不是以下拉列表的形式呈现给用,所以本人又对脚本做了优化,使之只需简单设置即可这一功能,也可以定义各个下拉列表的名称,也可以支持多语言(数据须后期再翻译)。 演示地址 http://demo.hpyer.cn/js/LocalList/ 下载地址 使用方式 <script type="text/javascript" src="LocalList.js"></script><script type="text/javascript">// 全世界数据var options = {    country: ‘country’,        // “国家”下拉列表的名称    state: ‘state’,            // “州”下拉列表的名称    city: ‘city’,            // “城市”下拉列表的名称    current: ‘CHN|33|1′,        // 当前默认值,用管道符“|”分割    language: ‘zh_cn’,        // 数据文件的语言   [...]

continue reading

POTCreator – Gettext POT文件生成器

Posted by Hpyer on 星期三, 一月 18th, 2012

概要 / Summary 这是一个用于生成 GETTEXT 的 POT 文件的类,然后你就可以使用 Poedit 进行翻译啦。 – This class can help you to create a POT file for GETTEXT, Then you can translate it by Poedit. 网上找了很久,都没有找到这样的工具,于是乎自己写了一个,大家使用过程中有问题,可以在此回复。 – Please report bug here, thank you! 主页 / Home:http://hpyer.cn/codes/potcreator 用法 / Usage <?php// 包含类库 – Include the classinclude(‘POTCreator.php’); // 创建对象 – Create object$obj = [...]

continue reading

ECShop插件 – 会员签到送积分

Posted by Hpyer on 星期四, 十一月 10th, 2011

如何留住用户,提高用户的回头率,一直是各类网站的重要关注的问题,尤其是商城类网站。ECShop提供基本的会员功能,可以方便的注册、购买、收藏,但是却没有足够留住老用户的功能。或许您会说其本身有用户推广分成的功能,但是又有多少商家会开通呢?本文介绍的就是这么一款具有该方面功效的ECShop插件——会员签到送积分。 效果图: 注:该图只是效果图,需买家提供与您网站切合的样式、图片等。 该插件具有如下功能: 支持每天赠送相同积分 支持递增积分赠送(即第二天赠送的积分比第一天多) 支持后台设置 支持任意位置添加签到按钮 现在购买本插件,您还可以得到: 帮助完成插件安装(需提供临时的FTP及后台的账号、密码),并调试完成 永久享受本插件的后续升级、修复服务(如:淘宝数据包升级而引起的功能失效等) 插件价格 100.00 RMB 注:此价格只包含前文所述的功能及服务,若需额外增加的朋友请联系站长协商。 购买方式 本站支持支付宝、财付通的担保交易,需要的朋友请即刻联系站长,以便提供购买链接给您。

continue reading

利用 jsonp 进行 Javascript 的跨域数据访问

Posted by Hpyer on 2008-10-23 - 13,018 Views - 9 Comments

一、基础知识

  1、什么是 JSON:JavaScript Object Notation (JSON) 是一种轻量级、基于文本、语言无关的数据交换格式。它是从 ECMAScript 语言标准衍生而来的。JSON为轻便的表示结构化数据,定义了一小套格式化规则。以下是一个 JSON 对象的例子:

{
    
"Image": {
        
"Width": 800,
        
"Height": 600,
        
"Title": "View from 15th Floor",
        
"Thumbnail": {
            
"Url": "http://www.example.com/image/481989943",
            
"Height": 125,
            
"Width": "100"
        
},
        
"IDs": [116, 943, 234, 38793]
    
}
}

  2、什么是 JSONP:JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成 Script tags 返回至客户端,通过 Javascript callback 的形式实现跨域访问(这仅仅是 JSONP 简单的实现形式)。

二、JSONP 的原理

  首先说明一下,想要使用 JSONP 来进行跨域访问,必须服务器端支持,原因后面再解释。和 AJAX 一样,JSONP 实际上也是早已存在,只是说法相对比较新颖(貌似也出来很久了,额…),而且所有做网页开发肯定都用过。为什么这么说?应为它用到的只是所有 HTML 元素中一个简单的 script 元素。看到这是不是觉得越发奇怪了?没关系,继续看下去就会茅厕(塞)顿开的,嘿嘿~来看个例子吧:
demo.html 文件

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo</title>
<script type="text/javascript">
function say(words) {
    alert(words);
}
</script>
</head>
<body>
<script type="text/javascript" src="demo.js"></script>
</body>
</html>

demo.js 文件

say("Hello, everyone!");

  运行 demo.html 文件后,是不是看到写着“Hello, everyone!”的警告框了?你可能会觉得这个例子很简单,没什么了不起的,甚至会在想:这和 JSONP 有关系吗?那么,我可以很肯定的告诉你:有关系!而且,这个例子实际上就是 JSONP 的原型!你也许会想到,JSONP 不是访问远程数据的吗?对,试想一下,如果 demo.js 文件在其它域的服务器上呢?结果会不会出现问题?我也可以很负责的告诉你:不会!你可以将上面例子中的 demo.js 更改为:http://demo.hpyer.cn/php/jsonp.php?callback=say 再试一下。
  现在,聪明的你应该已经明白 JSONP 到底是怎么回事了,那么,再来解释一下本节开头第一句话吧。看过 demo.js 文件的内容,应该知道,其只是对一个函数(通常称之为:回调函数)的调用,而需要交互的数据则通过参数形势进行返回。所以通过 JSONP 访问的服务器需要提供一个可以设置回调函数名的接口,就像 http://demo.hpyer.cn/php/jsonp.php?callback=say 中的 callback,所以,综上所述 JSONP 是需要服务器端的支持的。附上 jsonp.php 的源码:

<?php
$type = isset($_GET['type']) ? $_GET['type'] : '';
$callback = isset($_GET['callback']) ? $_GET['callback'] : '';
$json = '';
 
if ($type == 'json') {
    
$json = '{
        "Image": {
            "Width": 800,
            "Height": 600,
            "Title": "View from 15th Floor",
            "Thumbnail": {
                "Url":  "http://www.example.com/image/481989943",
                "Height": 125,
                "Width": "100"
            },
            "IDs": [116, 943, 234, 38793]
        }
    }
';
} else {
    
$json = '"Hello, everyone!"';
}
 
if (!empty($callback)) {
    
$json = $callback . '(' . $json . ')';
}
 
echo $json;
?>

三、jQuery 中的应用

  自 1.2 版本起,jQuery 加入了对 JSONP 的支持。我们可以很容易的利用 $.getJSON() 方法(或者其它基于 $.ajax() 的方法),来跨域加载 JSON 数据。来个例子吧:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo</title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
function do_jsonp() {
    $.getJSON("http://demo.hpyer.cn/php/jsonp.php?type=json&callback=?",
    function(data) {
        $('#result').val('data.Image.IDs: ' + data.Image.IDs);
    });
}
</script>
</head>
<body>
<a href="javascript:do_jsonp();">Click me</a><br />
<textarea id="result" cols="50" rows="5"></textarea>
</body>
</html>

  你可能注意到上面的例子中,url 被写成了 http://demo.hpyer.cn/php/jsonp.php?type=json&callback=?,需要说明的是,这个问号会被 jQuery 自动替换为回调函数的函数名(如果是一个匿名函数,jQuery 会自动生成一个带时间戳的函数名)。

四、小结

  通过本文的描述,相信你对于 JSONP 有了一个比较直观的了解,Hpyer 也相信,你也肯定可以举一反三的写出属于你自己的代码。其实,JSONP 的实现方法并不是只有回调函数一种,还有其它方式,例如将数据赋值给一个变量等。在 Web 2.0 的总体趋势之下,JS 显得越来越重要,并成了许多网页制作者所必学的一种脚本,所以,尽情的去体会 JS 带来的乐趣吧,Enjoy it!

Posted in: Web 技术.

9 Responses to “利用 jsonp 进行 Javascript 的跨域数据访问”

  1. ;) 学习学习,测试留言效果。

  2. @天下农, JSONP 是个好东西

  3. W:) test ajax留言功能

  4. 写的很清楚!

  5. [...] [参考文章] http://hpyer.cn/visit-remote-data-with-jsonp-in-javascript.html [...]

  6. 跟风测试留言功能:-D

  7. 非常感谢,经典的资料啊!

  8. 学习学习,不错。

  9. 讲的很清晰

Leave a Reply

About | Contact | Guestbook | Archives | Sitemap

如果您觉得本站的文章有帮助,并且条件允许的话,希望您能慷慨捐赠,以支持本站更好的发展。非常感谢!