分类 未分类 下的文章
href和onclick的javascript
href里面也可以运行javascript!
<a href="javascript:alert('i am href')">
那么, onclick和href哪个先运行? 答案是onclick
<a href="javascript:alert('i am href')" onclick="alert('i am onclick')">
并且onclick返回false会阻止href的运行.
<a href="javascript:alert('i am href')" onclick="alert('i am onclick');return false;">
js中如何不换行输出?
额, 当然是替代console.log了. 在node.js中用process.stdout.write(). 浏览器环境? 如果你是为了不换行输出数组值, 可以先把数组连接了再输出: console.log(somearray.join())
electron使用serialport的问题
由于serialport里面有一些原生编译的代码需要运行node-gyp提前build一下, 而node-gyp使用的node V8引擎版本与electron的V8引擎版本不同, 导致直接在node中可以require('serialport'),而在electron中却不行.
在electron中报错如下:
var SP = require('serialport')
C:\r\electron\macgetter\node_modules\bindings\bindings.js:83 Uncaught Error: A dynamic link library (DLL) initialization routine failed.
\\?\C:\r\electron\macgetter\node_modules\serialport\build\Release\serialport.node
at Error (native)
at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:168:20)
at Object.Module._extensions..node (module.js:583:18)
at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:168:20)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.require (module.js:483:17)
at require (internal/module.js:20:19)
at bindings (C:\r\electron\macgetter\node_modules\bindings\bindings.js:76:44)module.(anonymous function) @ ELECTRON_ASAR.js:168Module._extensions..node @ module.js:583module.(anonymous function) @ ELECTRON_ASAR.js:168Module.load @ module.js:473tryModuleLoad @ module.js:432Module._load @ module.js:424Module.require @ module.js:483require @ internal/module.js:20bindings @ C:\r\electron\macgetter\node_modules\bindings\bindings.js:76(anonymous function) @ C:\r\electron\macgetter\node_modules\serialport\lib\bindings.js:3Module._compile @ module.js:556Module._extensions..js @ module.js:565Module.load @ module.js:473tryModuleLoad @ module.js:432Module._load @ module.js:424Module.require @ module.js:483require @ internal/module.js:20(anonymous function) @ C:\r\electron\macgetter\node_modules\serialport\lib\serialport.js:12Module._compile @ module.js:556Module._extensions..js @ module.js:565Module.load @ module.js:473tryModuleLoad @ module.js:432Module._load @ module.js:424Module.require @ module.js:483require @ internal/module.js:20(anonymous function) @ VM133:1
查找了一些相关文档, 如下:
electron使用serialport
Using node-serialport in an electron app
node-serialport的官方回答, 看下面voodootikigod的回答:
Tracking Electron support #538
electron的官方回答:
Using Native Node Modules
先实践着...
YAML 参考卡
%YAML 1.1 # Reference card
---
Collection indicators:
'? ' : Key indicator.
': ' : Value indicator.
'- ' : Nested series entry indicator.
', ' : Separate in-line branch entries.
'[]' : Surround in-line series branch.
'{}' : Surround in-line keyed branch.
Scalar indicators:
'''' : Surround in-line unescaped scalar ('' escaped ').
'"' : Surround in-line escaped scalar (see escape codes below).
'|' : Block scalar indicator.
'>' : Folded scalar indicator.
'-' : Strip chomp modifier ('|-' or '>-').
'+' : Keep chomp modifier ('|+' or '>+').
1-9 : Explicit indentation modifier ('|1' or '>2').
# Modifiers can be combined ('|2-', '>+1').
Alias indicators:
'&' : Anchor property.
'*' : Alias indicator.
Tag property: # Usually unspecified.
none : Unspecified tag (automatically resolved by application).
'!' : Non-specific tag (by default, "!!map"/"!!seq"/"!!str").
'!foo' : Primary (by convention, means a local "!foo" tag).
'!!foo' : Secondary (by convention, means "tag:yaml.org,2002:foo").
'!h!foo': Requires "%TAG !h! <prefix>" (and then means "<prefix>foo").
'!<foo>': Verbatim tag (always means "foo").
Document indicators:
'%' : Directive indicator.
'---': Document header.
'...': Document terminator.
Misc indicators:
' #' : Throwaway comment indicator.
'`@' : Both reserved for future use.
Special keys:
'=' : Default "value" mapping key.
'<<' : Merge keys from another mapping.
Core types: # Default automatic tags.
'!!map' : { Hash table, dictionary, mapping }
'!!seq' : { List, array, tuple, vector, sequence }
'!!str' : Unicode string
More types:
'!!set' : { cherries, plums, apples }
'!!omap': [ one: 1, two: 2 ]
Language Independent Scalar types:
{ ~, null } : Null (no value).
[ 1234, 0x4D2, 02333 ] : [ Decimal int, Hexadecimal int, Octal int ]
[ 1_230.15, 12.3015e+02 ]: [ Fixed float, Exponential float ]
[ .inf, -.Inf, .NAN ] : [ Infinity (float), Negative, Not a number ]
{ Y, true, Yes, ON } : Boolean true
{ n, FALSE, No, off } : Boolean false
? !!binary >
R0lG...BADS=
: >-
Base 64 binary value.
Escape codes:
Numeric : { "\x12": 8-bit, "\u1234": 16-bit, "\U00102030": 32-bit }
Protective: { "\\": '\', "\"": '"', "\ ": ' ', "\<TAB>": TAB }
C : { "\0": NUL, "\a": BEL, "\b": BS, "\f": FF, "\n": LF, "\r": CR,
"\t": TAB, "\v": VTAB }
Additional: { "\e": ESC, "\_": NBSP, "\N": NEL, "\L": LS, "\P": PS }
...
新数据描述文件YAML
软件程序为了描述数据不遗余力有多重方式, 早期windows上有.ini文件, linux上有.conf文件. 后来.xml几乎成为了标配, 以及从.xml衍生的apple格式.plist.
xml衍生自html, 刚刚出来的时候大家都很兴奋, 确实在一段时间内几乎成为了一统江湖的格式. 然而xml与html不同的是, 在html中标签名称都比较简单短小, xml描述数据后key根据不同软件要求变得复杂, 前后一个括号将key写两遍变得很臃肿, key+value一共得占用三行,篇幅大阅读性也不够好.
后来json出来了, 大家就又松了口气, 舒服多了, key+value一行就够了, 写起来也舒服.
而现在yaml是要比json写更少内容的了. 甚至连大括号中括号都不用, 逗号也不用, 引号也不用, 所占用的行也没有了.
# 注释
name: John Smith
age: 37
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name: Jenny Smith
age 12
从内容上看起来让人想到了python和markdown. 使用缩进, 描述语言更容易阅读. 上面这段包含了key value关系, 层次关系, 列表(数组)关系.
对比json:
- 用缩进替代大括号表示层次关系, 这是python的手段;
- 用回车替代逗号表示不同元素, 这也是python的手段
- 继承了json使用冒号分隔key和value的方式
- 用减号替代方括号表示列表, 这是markdown的方式
- 注释使用井号#, 这是python的方式
- 字符串断行使用反斜杠\, 这与js是相同的.
- 最有趣的是, 如果你想在一行里面写多个元素, 你还可以使用js的[],{}语法
---
- [name , hr, avg ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa , 63, 0.288]
---
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
hr: 63,
avg: 0.288
}
- 还有个比json强大的地方, 可以使用&定义常量并在后面使用星号*引用, 如
name: &JS Jhon Smith
nameagain: *JS
- 有一个现在不太明白怎么用的, 就是使用三减号---分隔不同文档,使用三点...终结文档. 这样可以在一个文档里描述多个文档, 干嘛用? spec里说用在通信频道上?不清楚列
- 非常神奇的是, 可以使用一个复杂的对象作为key,而不是仅限于string, 这时候key需要以问号?开头
? - Detroit Tigers
- Chicago cubs
:
- 2001-07-23
? [ New York Yankees,
Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
2001-08-14 ]
- 对于value的类型,常见的类型是自动判断的
number: 123
float: 123.13
string: something is something
string2: "123"
bool: true
canonical: 2001-12-15T02:59:43.1Z
iso8601: 2001-12-14t21:59:43.10-05:00
spaced: 2001-12-14 21:59:43.10 -5
date: 2002-12-14
- 其他复杂的类型, 有些需要!!说明, 其他需要编程语言自己搞定. 通常是在key后面加叹号描述类型
---
not-date: !!str 2002-04-28
picture: !!binary |
R0lGODlhDAAMAIQAAP//9/X
17unp5WZmZgAAAOfn515eXv
Pz7Y6OjuDg4J+fn5OTk6enp
56enmleECcgggoBADs=
application specific tag: !something |
The semantics of the tag
above may be different for
different documents.
# Sets are represented as a
# Mapping where each key is
# associated with a null value
--- !!set
? Mark McGwire
? Sammy Sosa
? Ken Griff
%TAG ! tag:clarkevans.com,2002:
--- !shape
# Use the ! handle for presenting
# tag:clarkevans.com,2002:circle
- !circle
center: &ORIGIN {x: 73, y: 129}
radius: 7
- !line
start: *ORIGIN
finish: { x: 89, y: 102 }
- !label
start: *ORIGIN
color: 0xFFEEBB
text: Pretty vector drawing.
# Ordered maps are represented as
# A sequence of mappings, with
# each mapping having one key
--- !!omap
- Mark McGwire: 65
- Sammy Sosa: 63
- Ken Griffy: 58
安装node serialport
需要预先安装如下工具: python2.x, npm, visual studio.
npm需要安装工具node-pre-gyp和node-gyp
npm install -g npm-pre-gyp
npm install -g npm-gyp
在项目中
npm install serialport
哦, 每次装到最后都不显示任何信息了....
如果这时候require('serialport'),会出现这个错误:
C:\r\electron\macgetter\node_modules\bindings\bindings.js:91
throw err
^
Error: Could not locate the bindings file. Tried:
→ C:\r\electron\macgetter\node_modules\serialport\build\serialport.node
→ C:\r\electron\macgetter\node_modules\serialport\build\Debug\serialport.node
→ C:\r\electron\macgetter\node_modules\serialport\build\Release\serialport.node
→ C:\r\electron\macgetter\node_modules\serialport\out\Debug\serialport.node
→ C:\r\electron\macgetter\node_modules\serialport\Debug\serialport.node
→ C:\r\electron\macgetter\node_modules\serialport\out\Release\serialport.node
→ C:\r\electron\macgetter\node_modules\serialport\Release\serialport.node
→ C:\r\electron\macgetter\node_modules\serialport\build\default\serialport.node
→ C:\r\electron\macgetter\node_modules\serialport\compiled\5.2.0\win32\x64\serialport.node
at bindings (C:\r\electron\macgetter\node_modules\bindings\bindings.js:88:9)
at Object.<anonymous> (C:\r\electron\macgetter\node_modules\serialport\lib\bindings.js:3:35)
at Module._compile (module.js:399:26)
at Object.Module._extensions..js (module.js:406:10)
at Module.load (module.js:345:32)
at Function.Module._load (module.js:302:12)
at Module.require (module.js:355:17)
at require (internal/module.js:13:17)
at Object.<anonymous> (C:\r\electron\macgetter\node_modules\serialport\lib\serialport.js:12:25)
at Module._compile (module.js:399:26)
根据网上的解决方案:进入项目目录
C:\r\electron\macgetter>cd node_modules\serialport
C:\r\electron\macgetter\node_modules\serialport>node-gyp rebuild
输出一堆信息......最后
gyp info ok
然后就可以了.
cocos creator WebSocket在web与android上的一点小区别.
通过如下命令建立WebSocket连接.
ws = new WebSocket('ws://' + WS_SERVER)
常常需要判断ws.readyState是否处于OPEN状态, 然后决定是否要进行操作.
然而, 对OPEN等几个常量的调用, 在Android与Web上有不同.
例如, 在Web上, 调用 ws.OPEN, 则值为1, 在Android上则为undefined.
所以在这儿一定要使用WebSocket.OPEN, 无论Web还是Android都是1.
cocos creator android调试方式
假如xxx为app名
- 确定已经用debug模式完成编译, 生成了xxx_debug.apk文件.
- 确定已经可以使用vscode调试模拟器.
- USB连接手机, 在手机上安装xxx_debug.apk
- 使用adb运行此APP. 命令为:
adb shell am start -n "org.cocos2d.xxx/org.cocos2dx.javascript.AppActivity"
你此时应看到APP已经在手机上运行. - adb转发端口
adb forward tcp:5086 tcp:5086 - vscode开启调试模式, 查看console是否连接成功.
ar: attachRequest: address: localhost port: 5086
ar: attachRequest: retry socket.connect
ar: attachRequest: connected
开始打断点调试.
使用adb logcat 和findstr过滤输出信息
adb logcat | findstr "cocos"
注意, 魅族手机的开发者选项中, 默认只输出部分log,需要在开发者选项中打开全部log 的输出.
adb devices为空怎么办?
以windows为例:
1. USB连接手机, 确认打开USB调试模式.
2. 找到USB KEY ID.
打开: 设备管理器->Android Phone->Android Composite ADB Interface->详细信息->属性->硬件Id
看到值为如下:
USB\VID_7A98&PID_0C02&REV_????&MI_01
USB\VID_7A98&PID_0C02&MI_01
7A98即为ID
3. 进入 "C:\Users\YourUsername.android" 目录. 确定是这个目录的方式是, 其中有adbkey.pub和adbkey文件.
4. 在此目录中新建文件adb_usb.ini文件, 内容为:
0x7A98
也就是写入id, 保存.
5. 再次查看adb devices,应该已经可以看到了
JS的布尔运算返回的不一定是布尔值
布尔运算有三种, 与或非.
在C中, 布尔运算一定会返回布尔值.
在JS中却不同, 只有"非"运算一定会返回布尔值, "与或"都不一定返回布尔值.
a && b 与运算:
a为false/NaN/undefined/null/0/""时, 则返回a;
a不为以上值,如true/Object/"0" 则返回b;
注意, "0"被认为是true, ""被认为是false.
a || b 或运算:
和&&相反, a不为false/NaN/undefined/null/0/""时, 则返回a;其他情况返回b;
js中clone一个对象
貌似这个简单的操作会有无数种不同的方法.
- 使用Object.assign
var clone = Object.assign({}, obj);
这个方法貌似是新的js中支持的, 会有兼容性问题. 那么还有其他方法:
- y = _.clone(x);
这个是用的underscore库.
y = JSON.parse(JSON.stringify(x))
var bill = $.extend(true, {}, bob);
这是用的jquery库.
- 使用Object.create,但这并非真正的clone,而是继承.
y = Object.create(x);
- 其他
其他方法中最重要的就是自己写一个function, 去iterate key并且赋值.
参考:
(How do I correctly clone a JavaScript object?)[http://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object]
(4 CREATIVE WAYS TO CLONE OBJECTS)[http://heyjavascript.com/4-creative-ways-to-clone-objects/]
(Deep copy Javascript objects)[https://webdevwonders.com/deep-copy-javascript-objects/]
写了一个小工具,以texturepakcer替代bmfont
bmfont目前似乎是制作fnt位图字体的唯一工具, 可是每次选择图片/填写id都是一个非常蛋疼的事情. 更蛋疼的是, 无法打开以前保存的文件继续添加新的字体.
而TexturePacker合并贴图工具显然好用得多, 只需要将图片拖入, 点击Publish Sprite Sheet即可, 非常好用. 并且工程文件可以保存以便下次在编辑. 说实话这么好用, 即使没有工程文件也丝毫不影响效率.
这儿以TexturePacker导出cocos-2dx贴图为例, 讲讲怎么用TexturePacker制作fnt字体.
- 将所有字体图片以字体对应的字符命名
如0-9的字体png图片,需要分别命名为 0.png, 1.png等等; 也支持中文字体. 如果字符为不能作为文件名的特殊字符, 如/*\等, 可以使用下划线加id的方式,如 _48.png表示字符"0", _31532.png表示字符"第".
- 用TexturePacker的基本模式导出cocos2dx的图集, 设置如下:
Framework: cocos2d-x
Texture Format: PNG-32
Pixel Format: RGBA8888
Algorithm: Basic
Trim Mode: None
导出的图集名称如example.plist, example.png
- 下载工具
git clone https://github.com/darceye/myjs.git
npm install
将下载的工具目录添加到path中去.
转化
在导出的example.plist目录中, 使用命令行执行:plist2fnt example.plist
就会输出example.fnt. 与example.png一起导入到cocos creator中就可以使用.
js中转化char和int
js中转化char和int
var chr ='a';
console.log(chr.charCodeAt(0)); // output 97
var i=97;
console.log(String.fromCharCode(i)); //output 'a'
SVN update失败要求clean up, clean up也失败怎么办?
不得不说, svn真是操蛋啊....
安装sqlite, 在项目的.svn目录下,使用命令行执行以下操作, 手动清空svn的执行数据库即可再次clean up.
sqlite .svn/wc.db “delete from work_queue”