星期五 小雨 18~25℃
让scroll事件在滚动条停止时响应
var timeout = false;
$(window).on(‘scroll’, function () {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(function () {
// doing…
}, 100);
});
星期五 小雨 18~25℃
让scroll事件在滚动条停止时响应
var timeout = false;
$(window).on(‘scroll’, function () {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(function () {
// doing…
}, 100);
});
星期六 小雨转阴 6~13℃
chrome 实时查看页面 ip 的插件
PS:之前记录过一个SwitchHosts,也是一个切换 hosts 的系统小工具。
网站变灰CSS代码
html {
filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); /* ie */
-webkit-filter:grayscale(100%); /* chrome */
}
星期日 晴 8~17℃
GruntJS
grunt.js 是一个自动化构建工具,是 node.js 的一个组件。
使用 grunt.js 需要先安装 node.js,以前装 node.js 比较麻烦,现在直接下安装包来安装就可以了。
1 安装grunt
1.1 安装grunt命令行工具grunt-cli
使用 -g 全局安装,这样可以在任何一个目录里使用了。
命令:
npm install -g grunt-cli
1.2 grunt版本查看
命令:
grunt -version
2 搭建前端项目
(*以下提到的顶目根目录,也可以是项目的静态文件根目录,例如 static)
2.1 新建 package.json
package.json放在根目录下,它包含了该项目的一些元信息,如项目名称、描述、版本号,依赖包等。它应该和源码一样被提交到svn或git。
package.json内容需符合JSON语法规范,如下
{
"name": "koudaitong-isv",
"version": "0.1.0",
"devDependencies": {
"grunt": "~0.4.1",
"grunt-contrib-jshint": "~0.3.0",
"grunt-contrib-uglify": "~0.2.0",
"grunt-contrib-concat": "~0.1.3",
"grunt-contrib-watch": "~0.3.1",
"grunt-contrib-less": "~0.5.0",
"grunt-regarde": "~0.1.1",
"grunt-contrib-livereload": "~0.1.2",
"grunt-contrib-connect": "~0.2.0"
}
}
2.2 新建 README.md 文件
用文本编辑器,里面输入 readme 内容,任意文本
2.3 安装grunt及其插件
打开命令行工具进入到项目根目录
命令:
npm install
下载的 grunt 版本及其插件版本,以 package.json 里的 devDependencies 设置为准。
2.4 新建 Gruntfile.js 文件
Gruntfile.js也是放在项目根目录下,几乎所有的任务都定义在该文件中,它就是一个普通的js文件,里面可以写任意js代码而不仅局限于JSON。和package.json一样它也要和源码一样被提交到svn或git。
Gruntfile.js由以下内容组成
1、wrapper函数,结构如下,这是Node.js的典型写法,使用exports公开API
module.exports = function(grunt) {
// Do grunt-related things in here
};2、项目和任务配置
3、载入grunt插件和任务
4、定制执行任务
Gruntfile.js 例子(该示例完成以下任务):
1、合并src下的文件(ajax.js/selector.js)为domop.js
2、压缩domop.js为domop.min.js
3、这两个文件都放在dest目录下
module.exports = function(grunt) {
// 配置
grunt.initConfig({
pkg : grunt.file.readJSON(‘package.json’),
concat : {
domop : {
src: ['src/ajax.js', 'src/selector.js'],
dest: ‘dest/domop.js’
}
},
uglify : {
options : {
banner : ‘/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n’
},
build : {
src : ‘dest/domop.js’,
dest : ‘dest/domop.min.js’
}
}
});
// 载入concat和uglify插件,分别对于合并和压缩
grunt.loadNpmTasks(‘grunt-contrib-concat’);
grunt.loadNpmTasks(‘grunt-contrib-uglify’);
// 注册任务
grunt.registerTask(‘default’, ['concat', 'uglify']);
};
2.5 执行grunt任务
打开命令行,进入到项目根目录。
命令:
grunt
2.6 命令行快捷方式
创建 cmd 的快捷方式,右键属性,在快捷方式的“起始位置”输入项目根目录,这样就不用每次都手动进入该目录了。
资料参考
解决modem log is stopped提示的方法
手机root后,每次重启过一会都会出现提示:
modem log is stopped.
字面意思是“调制解调器日志记录已经停止运行”。
(有可能是某一些应用激活了该服务,偶然发现可能和墨迹天气有关)
治标不治本的方法:
“应用管理 -> 正在运行”停止该服务。
根治的方法:
向下划动屏幕,点击“modem log is stopped”提示,选中 modem log 选项,然后点击 start (不要勾选 start automatically when reboot)。重启手机。
另一个根治的方法是找到激活该服务的应用,卸掉试试(我卸了墨迹天气就好了)。
参考:http://wenku.baidu.com/view/8b4ce4f704a1b0717fd5ddaf.html
办公室健身(15)
俯卧撑,上午 45 个。
星期五 上午阵雨转阴,下午阴 8~20℃
chrome扩展开发笔记(9) 发布插件到 Chrome 网上应用店
发布地址:https://chrome.google.com/webstore/developer/dashboard
星期五 多云 6~18℃
chrome扩展开发笔记(8) 已安装扩展的存放目录
win7 的 chrome 扩展存放目录:
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default\Extensions
Administrator 换成自己电脑的用户。
里面可以看到源码。
办公室健身(7)
俯卧撑,早上 40 个。
星期四 多云 3~11℃
thinkpad 禁用触摸板和小红帽的方法
见这篇日志的更新:http://www.zhugao.net/today/2013/1780.html
SwitchHosts
https://github.com/oldj/SwitchHosts
注意:使用时会替换当前 hosts 文件内容,如果系统 hosts 里有自定义内容,建议事先备份。
html5 本地存储(localStorage)的一些资料
项目不考虑 IE,终于可以无顾忌的使用 html5 了。
localStorage 的一些参考资料:
让notepad++支持less语法高亮
参考:http://www.smuwcwt.com/archives/697
办公室健身(6)
俯卧撑,早上 50 个。
星期三 中雨转阴 2~11℃
chrome扩展开发笔记(7) 内容安全策略(CSP)
如果使用 setInterval 或 setTimeout 可能会报以下错误:
Refused to execute JavaScript URL because it violates the following Content Security Policy directive: "script-src ‘self’ chrome-extension-resource:".
解决方法是 function 不要以字符串的形式传入,例如:
setInterval("fn()", 1000)
setTimeout("fn()", 1000)
似乎也不能用匿名函数传入(不确定),例如:
setInterval(function(){}, 1000)
统一改成以下形式:
setInterval(fn, 1000)
setTimeout(fn, 1000)
参考:
http://open.chrome.360.cn/extension_dev/contentSecurityPolicy.html
https://sites.google.com/site/crxdoczh/reference/formats/manifest/contentsecuritypolicy
星期日 阴 5~14℃
解决ThinkPad鼠标串动问题(禁用触摸板和小红帽的方法)
2013-3-14 更新
外接USB鼠标后,如果在操作时不小心触到触摸板,相当于两个鼠标同时使用,引起鼠标失控(串动)。
进入:
控制面板 – 鼠标 – UltraNav
(如果没有 UltraNav 选项卡,则需要安装 UltraNav鼠标驱动,选择对应的 thinkpad 型号查找鼠标驱动)
禁用触摸板的方法:
把“启用 TouchPad”前的勾取消。
禁用小红帽的方法:
把“启用 TrackPoint”前的勾取消。
不过这两个功能不能同时禁用。可以按下面的方法设置,以更保险的不让“鼠标串动”的现象发生:
先禁用触摸板功能,然后点小红帽功能边上的“设置”按钮,把滑尺移到“重按”的一端。
参考:http://zhidao.baidu.com/question/496847014.html
2013-3-16 更新:
今天发现重启后,触摸板又被激活了,要重新进入控制面板。
原因:
尊敬的联想用户您好,重新启动后触摸板会重新启动,您需要在控制面板–鼠标–触摸板选项中重新设置即可。此情况是为了避免在外出携带时,没有鼠标,避免造成无法使用的问题。
找了个 BIOS 禁用触摸板的方法:
进入BIOS > Config > Keyboard/Mouse > TouchPad,设置为Disabled
但是发现我的 E430c 在 BIOS 里没有找到这个 TouchPad 这个选项。
没办法,只好进控制面板,把“鼠标”快捷方式拖到开始菜单的“启动”项里,这样每次开机会自动打开鼠标控制面板,直接关闭面板就可以了,不用设置。
chrome扩展开发笔记(6) notification(桌面通知)
第一次开发chrome扩展,摸索,现学现用,花了大约五天时间完成我的第一个chrome扩展,比预计的时间延迟了两天。
今天再把 notification 总结一下。
1、加载 html
可以使用 webkitNotifications.createHTMLNotification 加载 html 页面
例:
var notification = webkitNotifications.createHTMLNotification(‘notification.html’);
2、对输入兼容性不好
例如在 notification 里放一个 textarea,只有当前窗口是 chrome 时才可以顺利输入,如果当前窗口是其他程序,则不能获取到 textarea 输入焦点。
3、如何只弹出一个桌面通知
先定义一个标记状态,然后使用 onclose 事件,关闭时改变标记状态。
例:
var notify_is_close = true,
notification = null,
b_interval;function init() {
b_interval = setInterval(function () {
if (notify_is_close) {
notification = webkitNotifications.createHTMLNotification(‘../notification.html’);
notify_is_close = false;
notification.onclose = function () {
notify_is_close = true;
}
notification.show();
}
}, 3000);
}init();
4、在 popup 里关闭 notification
接上例,在 background.js 里定义一个关闭桌面通知的 fn
function closeNotification() {
notification.cancel();
notify_is_close = true;
}
然后在 popup.js 里可以通过 getBackgroundPage() 调用这个 fn
chrome.extension.getBackgroundPage().closeNotification();
关于 notification 的详细参考:
http://open.chrome.360.cn/extension_dev/notifications.html
http://dev.chromium.org/developers/design-documents/desktop-notifications/api-specification
在家健身(65)
以前的日志里写“仰卧起坐”,后来听说更准确的词是“卷腹”(和上学时体育课的“仰卧起坐”区分开)。
星期六 晴转多云 8~30℃
chrome扩展开发笔记(5) 关于 manifest_version
manifest.json 里的 manifest_version 字段。
manifest_version
用整数表示manifest文件自身格式的版本号。从Chrome 18开始,开发者应该(不是必须,但是2012年底左右就必须了)指定版本号为2(没有引号),如下所示:
"manifest_version": 2
manifest版本1从Chrome 18才开始逐步被弃用,版本2目前并不是必须的,但预计我们将在2012年底强制只支持版本2。还没有准备好支持manifest版本2的扩展、应用和主题,可以明确指定版本1,或者索性不提供本字段。
参考:http://open.chrome.360.cn/extension_dev/manifest.html#manifest_version
manifest_version 设为 2 后,有一些旧的字段不能使用。
比如,原来的
"background_page": "background.html"
要改成
"background": { "page": "background.html" }
另外,也不能直接在 html 上写 js,要用 src 引入 js 文件。
办公室健身(4)
俯卧撑 40 个,上午十点。
星期五 晴 7~26℃
chrome扩展开发笔记(4) manifest.json 里 icons 尺寸
manifest.json 里面的 icons 设置,建议设置成 icon 尺寸的两倍,否则在苹果 Retina 下图标会有点糊。
"icons": {
"128": "icon_256.png",
"48": "icon_96.png",
"19": "icon_38.png"
}
js“提示还可以输入多少字数”
function countStrLength(str) {
var str_length = 0;
for (var i = 0; i < str.length; i++) {
if (str.charCodeAt(i) <= 256) {
str_length += 1;
} else {
// 中文,可以根据需要改为 2
str_length += 1;
}
}
return str_length;
}
function checkLength(obj, maxnum, numid) {
var less_num = document.getElementById(numid);
var str = obj.value;
var len = maxnum – countStrLength(str);
if (len < 0) {
less_num.style.color = ‘#f30′;
} else {
less_num.style.color = ‘#333′;
}
less_num.innerHTML = len;
}
引用:
<textarea onkeyup="checkLength(this,100)"></textarea>
屌丝团记忆(1) 聚餐
人员到齐了,三个后端,三个前端,当然还有一个总,一共七个。
今晚聚一聚。
办公室健身(3)
俯卧撑 40*2,上午十点、下午六点各一组。
计划以后来公司第一件事就是先做俯卧撑。