coding life2011-10-24~2011-11-12
以下是最近的一些杂记录,主要是javascript为主。
?
其实10月以来关注移动开发比较多,天天都会逛逛jquerymobile论坛,不过后来参与的项目彻底不用jquerymobile了,哎,折腾来折腾去一早就直接用app就好了。关于jquerymobile,phonegap这些的后面想好了再写下。
?
时间太少,想法太多,说实在我对android这些还真不是很感冒,看着自己的前端后端了解的肤浅,还费时间去看android代码,就总想自己是不是太泛滥了。不过后来想下,一来公司用到,二来,反正就些api而已嘛,参与这个项目中间的过程给我的反思才是重点。呵呵,不乱说太多了。
?
Java:
?
1.Taperstry:
Page里的字符串写法
binding 表达式里 ? ? ? ? <binding name="rel" expression="'external'"/> 用单引号'标示字符串
另外如果这里的字符串包含双引号和单引号,那就郁闷了,我折腾了了一下发现都是不生效的。
?
2.servlet ajax 返回字符多了空格换行。
这个是菜鸟问题,看到个同事在servlet里返回ajax的时候调用println然后说返回的字符不对郁闷了半天,这叫我情何以堪。以后千万要记得response.getwriter.print,别点多了写成response.getwriter.println。
另外在js端也可以去掉多余的字符
data = data.replace(/^\s*/, ""); //去除前置空格
data = data.replace(/\s*$/, "" ); //去除后置空格
?
另外还有一个菜鸟问题,设置字符集的时候一定要再getwriter之前,否则字符集是不生效的。
getResponse().setContentType("text/plain; charset=UTF-8");
getResponse().getWriter();
?
?
Android:
?
?
1.Sensor
android.hardware.SensorManager允许访问 Android 平台传感器的类。并非所有配备 Android 的设备都支持 SensorManager 中的所有传感器,虽然这种可能性让人非常兴奋。传感器类型 :方向、加速表、光线、磁场、临近性、温度等。
android.hardware.SensorListener在传感器值实时更改时,希望接收更新的类要实现的接口。应用程序实现该接口来监视硬件中一个或多个可用传感器。例如,本文中的 代码 包含实现该接口的类,实现后可以监视设备的方向和内置的加速表。
?
2.
?
this.runOnUiThread(runnable);
在Thread1中创建一个Thread2,使用Thread2将处理后的数据返回到界面中,但是要特别注意的是,android只接受在activity线程中处理UI,所以需要使用callback函数将Thread2设为activity的线程
?
3.phonegap
phonegap可以在js里面调用java代码从而调用手机的功能。
之前我以为phonegap是使用在webview上的绑定java object的addJavascriptInterface方法来实现的。
后来看了下代码,发现在1.0版本中就不是了(貌似老版本就是通过addJavascriptInterface来实现的)。在1.0版本中是通过js的prompt来进行捕捉js的事件然后调用plugin。具体参考GapClient.onJsPrompt方法以及js里面的exec方法。
网上也有文章说到:http://www.blogjava.net/lincode/archive/2011/09/20/359014.html
?
Linux
1.mbr?master boot record:硬盘主要开机扇区,硬盘的第一个扇区var myObj = {a: 1, b: 2, c: 3}, myKeys = [], i=0;for (myKeys[i++] in myObj);myKeys; //['a','b','c'];?
2.jsonp
?
var logIt = function(data) { //print last tweet text window.console && console.log(data[0].text);}var scriptTag = document.createElement('SCRIPT');scriptTag.src = "http://www.twitter.com/status/user_timeline/angustweets.json?count=5&callback=logIt";document.getElementsByTagName('HEAD')[0].appendChild(scriptTag);
?
?这个具体参考
http://javascriptweblog.wordpress.com/2010/11/29/json-and-jsonp/
?
3.从angus croll博客中摘录的一个关于闭包的代码片段
?
js closure//VariableEnvironment: {x: undefined, etc.};var x = "global";//VariableEnvironment: {x: "global", etc.};function outer() { //VariableEnvironment: {y: undefined, outerLex: {x: "global", etc.}}; var y = "outer"; //VariableEnvironment: {y: "outer", outerLex: {x: "global", etc.}}; function inner() { //VariableEnvironment: {x: undefined, outerLex: {y: "outer", outerLex: {x:"global", etc.}}; var x = "inner"; //VariableEnvironment: {x: "inner", outerLex: {y: "outer", outerLex: {x:"global", etc.}}; }}
?
?所以js的闭包能引用外面的变量其实就是通过这个variableEnvironment。够清晰了吧?
?
4.说到前端性能不能不看yahoo上的这个。
?
http://developer.yahoo.com/blogs/ydn/posts/2007/07/high_performanc_5/
http://developer.yahoo.com/performance/rules.html
?
?
5.~
~号在javascript中的定义
?
Performs the NOT operator on each bit.?
所以下面是一个有趣的例子:
?
If b is not a member of array a, add it to the end of the array (ECMA 5)
~a.indexOf(b)||a.push(b)
因为如果b不在a中,那么indexof为-1.~-1为0,其他都不为0,而0在js中是返回为false,其他都是true,所以这里可以巧妙的实现上述的需要。
?
?
6.js变量声明
?
多个变量声明,多个变量声明应该分多行,如:
?
var namespace = name.split( "." )[ 0 ], fullName;
?
?
7.caller callee
?
caller
对于函数来说,caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的,那么 caller 包含的就是 null 。
callee
? 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
例子,判断是否提供了所有参数
?
var func = function(a,b,c) {//利用判断是否提供了所有参数 for (var i=0; arguments[i] !== undefined; i++); var allArguments = (i >= arguments.callee.length);//arguments.callee.length获取定义参数的长度}
?参考:
?
? http://hi.baidu.com/mengjin/blog/item/44c754432f458c119213c6d3.html
?
?
8.void
?
The void operator is often used merely to obtain the undefined primitive value, usually using "void(0)" (which is equivalent to "void 0"). In these cases, the global variable undefined can be used instead (assuming it has not been assigned to a non-default value).
例子
for (var i=arr.length, r=0; i-- || void (r = r*x); r += arr[i]);
这里利用i-- 来作判断,||后面的永远为false,但是却是执行了一个操作,等价于
for (var i=arr.length, r=0; i-- ; r += arr[i]){r = r*x;}当为属性调用方法的时候,this为对象var foo = { bar:function() { //(Comments apply to example invocation only) //MemberExpression = foo.bar //thisValue = foo //ThisBinding = foo return this; }};foo.bar(); //foo当为变量调用的时候,this为global objvar bar = function() { //(Comments apply to example invocation only) //MemberExpression = bar //thisValue = undefined //ThisBinding = global object (e.g. window) return this};bar(); //windownew 之后的构造器里this为该对象
foo.bar(); // foo(foo.bar)(); // foo(foo.bar = foo.bar)(); // global 这里返回的是一个方法(foo.bar || foo.baz)(); // global(function () {})(); // global
var sorter = { sort: function() { alert('sorting'); }, requestSorting: function() { this.sort(); }}$('sortButton').onclick = sorter.requestSorting;//调用onclick的时候会调用btn的sort方法 错误的$('sortButton').onclick = sorter.requestSorting.bind(sorter);//绑定为sorter 才正常?上面的这个例子应用闭包修正如下:
var sorter = (function () { var sort = function() { alert('sorting'); }; return function(ev) { sort(ev.target); };}());$('sortButton').onclick = sorter;?
?
?
?
?
?
HTTP
?
1.http accept headers
http://www.gethifi.com/blog/browser-rest-http-accept-headers
accept的例子:
?
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
?
这里的q就是权重,1是最大,如果不写就是1. 所以这里代表了浏览器想要接受的内容类型的优先级是html或者xhtml,优先级是1.然后如果不行的话就给xml,优先级是0.9,再不行,那就什么类型都发过来就可以了。
当然,不同浏览器对这个accept的处理是有些不同的。呵呵,不过大体上是类似上面差不多,可以参考上面的链接看看。
?
?