Everyone is a genius.

Aside

最近遇到一个问题,我在 javascript 中为一个 textnode 添加空格(使用 ),之后试图在 js 中将这一个空格与一个空格字符(‘ ‘)做比较,发现总是不能够成功,在查阅了一些资料之后发现,textnode 中的空格并不是 ‘ ‘ 而是一个 char code 为 160 的字符,因而我使用了 String.fromCharCode(160) 的返回值来进行比较,结果可以正常运行。

Aside

最近一直在写一个 HTML 的在线代码编辑器,使用了一个 div 并且设置 contenteditable 属性来作为基础的编辑器,但是发现有一个问题,这一个 div 的第一行一定会是一个 textnode,而之后的行都会是 div 的节点,这样一来就给编码带来了难度,我需要先知道某一个 node 的 nodeType 才能对这一个 node 进行操作(不同类型的 node 内部的属性是不一样的)。今天偶然发现,如果我先在 div 内按回车,第一行的 textnode 会自动转化为一个带了一个换行符的 div 如下:

<div>
    <br/>
</div>

由此想到如果说我在网页一开始就为我的 div 先加入一个以上类型的子 div 是不是就可以解决这一个问题呢?经过测试,确实可以,我的代码如下:

<html>
	<head>
		<script type="text/javascript" charset="utf-8" src="jquery-1.8.2.min.js"></script>
		<script type="text/javascript" charset="utf-8" src="jquery-ui.min.js">
		</script>
        <script>
            $(document).ready(function(){
		        var content = document.getElementById('content');	
		        var emptyNode = document.createElement('div');
		        emptyNode.innerHTML = '<br/>';
		        content.appendChild(emptyNode);
	        }
            );
        </script>
	</head>
	<body>
		<div id='content' contenteditable='true'></div>
	</body>
</html>

这么一来,终于是搞定了一个一直困扰我的问题。

Aside

今天稍微看了一下 Android 的主题,发现有很多的选项,我们可以通过定义自己的 style 来制作出我们需要的主题,在官方的 R.attr 文档(http://developer.android.com/reference/android/R.attr.html)中,我看到了一个选项叫做 windowIsTranslucent, 描述如下:

public static final int windowIsTranslucent
Added in API level 1 Flag indicating whether this is a translucent window. Must be a boolean value, either "true" or "false". This may also be a reference to a resource (in the form "@[package:]type:name") or theme attribute (in the form "?[package:][type:]name") containing a value of this type. Constant Value: 16842840 (0x01010058)

也就是说,我可以在自定义的 theme 中使用 true 或者 false 来设置它,由此我的 Theme 如下

<style name="floatingTheme" parent="android:Theme.Light">
    <item name="android:windowIsTranslucent">true</item>
</style>

我定义了一个新的 Theme ( 使用 style 标签 ),然后让这个 Theme 继承于 android:Theme.Light ( 背景是白色的主题 ),然后我给它添加了一个属性,就是我之前提到的 windowIsTranslucent, 并且将其设置为 true, 这样一来就实现了透明背景的功能了。之后我在 manifest 中将 android:theme 设置为 @style/floatingTheme 就 OK 了。但是我运行之后发现并没有透明背景的效果, 后来查了一些资料并通过自己的实践知道原来它只是使得你的背景可以透明,而不是直接透明,也就是说我们需要去设置一个透明的背景,这样我在 style 中进行如下修改:

<style name="floatingTheme" parent="android:Theme.Light">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@color/transparent_color</item>
</style>

最后在 /res/values/colors.xml 中添加 transparent_color。

<resources>
    <color name="transparent_background">#A0FFFFFF</color>
</resources>

保存,运行,就大功告成了。