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

Javascript 中 click 和 dblclick 事件冲突问题的解决办法

Posted by Hpyer on 2008-09-27 - 6,930 Views - No Comment

  一个DOM元素,如:div,既绑定了 click 事件,又绑定了 dblclick 事件,这两个事件分别要做独立的事情。事件处理上没有冲突,都可以各自完成各自的操作。双击的时候虽然是执行了 dblclick 事件,但是在这之前,也执行了 click 事件,那么,如何来禁止或者说屏蔽这次多余的 click 事件呢?本文将提供给您一个比较好的解决办法。

情况分析
  首先,来了解一下点击事件发生的先后顺序:

  • 单击:mousedown, mouseup, click
  • 双击:mousedown, mouseup, click, mousedown, mouseup, click, dblclick

  由此看来,dblclick 事件发生之前,实际上发生了两次 click 事件。其中,第一次的 click 是会被屏蔽掉,但是第二次则不会,所以就出现在双击的时候,也触发 click 事件。

解决办法
  知道了原因,接下来自然就是想办法把这次 click 给屏蔽掉,但是由于各浏览器均未提供直接去停止事件的方法,所以值得改变思路。
  由于我们只需要屏蔽一次 click 事件即可,由此联想到,可以利用 setTimeout() 方法来延时完成 click 事件的处理,在需要停止 click 的时候利用 clearTimeout() 方法停止这一事件的处理。这样,就可以比较容易的写出如下的 javascript 代码:

  1. var timer = null;
  2.  
  3. function do_click(event) {
  4.     clearTimeout(timer); // 这里加一句是为了兼容 Gecko 的浏览器
  5.     // if (event.detail == 2) return ; // 同上句的作用
  6.  
  7.     timer = setTimeout(function() {
  8.         // click 事件的处理
  9.     }, 300);
  10. }
  11.  
  12. function do_dblclick(event) {
  13.     clearTimeout(timer);
  14.     // dblclick 事件的处理
  15. }

测试代码
需要 jQuery 类库,你可以从 jquery.com 获取到最新版本

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title>Test</title>
  5. <script type="text/javascript" src="jquery.js"></script>
  6. <script type="text/javascript">
  7. var Test = {
  8.     times: 0,
  9.     timer: null,
  10.     logs: [],
  11.     first: null,
  12.     last: null,
  13.     do_click: function() {
  14.         var self = Test;
  15.         self.start();
  16.         clearTimeout(self.timer);
  17.         self.times++;
  18.         self.timer = setTimeout(function() {
  19.             self.logs.push('click');
  20.             self.echo();
  21.         }, 300);
  22.     },
  23.     do_dblclick: function() {
  24.         var self = Test;
  25.         clearTimeout(self.timer);
  26.         self.logs.push('dblclick');
  27.         self.echo();
  28.     },
  29.     start: function() {
  30.         if (this.first == null) {
  31.             this.first = new Date().getTime();
  32.         }
  33.     },
  34.     end: function() {
  35.         if (this.last == null) {
  36.             this.last = new Date().getTime();
  37.         }
  38.     },
  39.     get_time: function() {
  40.         return (this.last - this.first) || 0;
  41.     },
  42.     echo: function() {
  43.         var self = Test;
  44.         self.end();
  45.         var log = 'No.' + self.times + '; Use time: ' + self.get_time() + 'ms; Event: ' + self.logs.join(', ') + ';<br />\n';
  46.         $('#log').prepend(log);
  47.         self.first = null;
  48.         self.last = null;
  49.         self.logs = [];
  50.     },
  51.     init: function() {
  52.         $(document).ready(function() {
  53.             $('div').click(Test.do_click).dblclick(Test.do_dblclick);
  54.         });
  55.     }
  56. };
  57. Test.init();
  58. </script>
  59. </head>
  60. <body>
  61. <div style="width:200px; height:50px; border:1px solid #999;">Click / DblClick Me!</div>
  62. Log:<br />
  63. <textarea id="log" rows="20" cols="50"></textarea>
  64. </body>
  65. </html>

问题总结
  从测试结果来看,如果前后两次点击的时间在 300ms 左右的时候,还是很容易出现 click 和 dblclick 事件被“同时”调用的情况,而如果间隔的时间更短或更长,则只会有 click 或 dblclick 事件。
  所以,应该说这个方法已经在很大程度上,避免了 click 和 dblclick 事件的“同时”存在问题。当然,它还没有达到完全解决的程度。

需要注意的地方

  • windows 的控制面板里是可以调鼠标的双击速度的(Linux 等系统下能不能调,俺就不清楚了),这点对于程序还是有一定影响,大家可以自己调节下试试看~
  • 经过测试,延时 300ms 是一个比较理想的事件,既考虑到对鼠标操作并不十分顺利的朋友,也兼顾 click 事件的响应速度
  • 以上代码,只在 IE6、FF3、Chrome 中测试过,并未出现问题

Posted in: Web 技术.

Leave a Reply

About | Contact | Guestbook | Archives | Sitemap

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