每种语言都有自己的特殊字符,比如引号、反斜杠等,当我们需要把这些字符当作普通字符使用时,就必须在前面加上一个转义符(escape character),例如JavaScript中需要输出双引号时,就要用\”。想一下,如果用R输出“能输出HTML字符的Java脚本”,那样转义符会是什么模样。
比如HTML中需要一对双引号:”",用Java脚本写的话就是:document.write(“\”\”"),用R来写这句Java脚本的话就是:cat(“document.write(\”\\\”\\\”\”)”)。而我需要的Java脚本远比这复杂,不幸的是用R写出来之后Firefox运行正常,IE不正常,说脚本有错,额滴神啊,人海茫茫让我上哪儿去给您找错,IE也没一个debug功能。这就是我崩溃的原因。
为了MSIE能利用自身的缓存,真是让我想破了头。好在到现在终于找到了一种解决办法,其实所有的技巧都在于:不要用JavaScript调用任何与URL有关的对象。既然不能用JavaScript动态改变页面内元素(比如图形<img src=… />)的URL,那么,想要在页面内动态且快速显示图片的路基本上只剩下一条了,那就是CSS。基本原理是:利用JavaScript动态改变一个层(<div id=…></div>)的CSS属性,若想让它显示,则设置为*.style.display = “block“;否则,设置为*.style.display = “none“。通过对若干个层的依次显隐,一副动画就大功告成了。
当然,Firefox对这种办法也是支持的。至此,我才基本搞定了动画在网页上的显示方式——万里长征的第一步。
今天看JavaScript Reference顺便也了解到window.onload的作用,当一个页面在客户端加载完成之后这个函数就会被调用,因此可以事先在页面内放置一个“正在加载”的说明字样,等页面全都加载完毕了之后把这个说明隐去,并将动画的“开始”按钮设置为可用(disabled = false)。这样一个动画页面就完美了,吼吼。
依然参见:http://r.yihui.name/misc/java.htm(猛增速度,faster,直接把时间间隔减小到0秒,看看是什么效果)
在此之前,我走的弯路太多了,现在综合起来也就一个特点:那些方法全都涉及到URL……
- 比如设置图片的src属性(*.src = …)
- 比如设置表格的背景(*.setAttribute(“background”, …))
- 比如设置对象的背景图像(*.style.backgroundImage = “url(…)”)
- 比如把一个对象的HTML代码(包含图片标签)赋给另一个对象(*.innerHTML = **.innerHTML)
- 等等
而对一个对象的显隐控制不会涉及到图片地址,只是单纯的显示或隐藏一个对象——实质上它一直都在这个页面里。
昨天半夜被一个JavaScript的问题迷惑了好一阵子,然后才反应过来,这又是IE和Firefox的差别。主要问题是,Firefox对 document.all["id"] 这种获取页面内元素的方式并不太支持,而最好通过 document.getElementById(“id”) 这种更严格的方式来引用页面内的对象;对于IE而言,两种方式都可以。
之所以涉及到这个问题是因为我想在HTML页面中直接实现动画展示,省得还要费尽苦心去研究GIF文件格式然后读写GIF文件以便生成GIF动画文件,通过JavaScript的方式生成动画比研究GIF要容易多了,只需要调用Java脚本改变一幅图的src属性就足够了,然后用一个循环让图像“动”起来。示例参见:http://r.yihui.name/misc/java.htm页面底部(点击按钮观看布朗运动)
这两个网站是我所看到比较经典的JS图片放大效果网站:
前者是在页面内缩放,后者是采用的“全屏”效果,我看后者的代码稍微简单一些,就采用了后者,不过也借鉴了前者的一个放大镜图标,这样有助于提醒访问者他所看到的这幅图片时可以继续放大的;不过这个图标还费了我半天劲才让它在IE中也显示出来,主要是IE对CSS中文件路径的解析比较奇怪,而Firefox就能正确解析出来。
那么以后本站中的图片就可以有缩放效果啦!而且对于多幅图片,还可以以幻灯方式依次浏览,嗯,8错8错。
昨天花了好半天时间把这个Blog的模板自己重新改写了一遍,这个过程中曾经对层(div)的对齐问题恼火了一阵子,因为设置body的文本对齐为居中之后,里面的div在Firefox下死活都不肯居中对齐,后来才明白,必须得设置div的左右边距为auto才行。总体感觉Firefox对HTML的解析还是好一些,比如本页右边的那些方框中的列表项我都设置了强制不换行(white-space: nowrap;)、隐藏多余的部分(overflow: hidden;),可是当鼠标移上去的时候,IE就会把多余的部分又给显示出来,而Firefox就不会。这一点我想了半天都没找出好办法解决,于是就那样扔着吧,不管了。
其实这次改模板的主要目的是想应用<fieldset>和<legend>这两个标签,顺便把灰色的背景改为白色、把引用<blockquote>和代码<pre>的样式重新设置一下。一段时间之前我曾经看到过一个叫Planet PHP的国外Blog站,当时特别喜欢它那种像Visual Basic里面Frame控件的格式,也就是这样的:
While FIELDSET is not supported by old browsers, it can be used safely by explicitly closing any preceding P element with </P> or by including an empty P prior to the FIELDSET. This causes non-supporting browsers to infer the start of a block-level element even though they ignore the block-level FIELDSET element.
The content of a FIELDSET element must begin with a LEGEND to provide a caption for the group of controls. Following the LEGEND, FIELDSET may contain any inline or block-level element, including another FIELDSET.
因此看了看它的网页源码,发现用的是<fieldset>和<legend>标签,本来之前觉得挺神奇,还以为是用CSS+表格作出来的,看了源码才知道原来这么简单。于是乎,我这个Blog页面也就改造成这样了。
关于引用和代码的样式,其中“引用”采用了一个“引号”的图片作为背景放在左上位置,而“代码”采用了上下两条水平虚线作为分界标志,这两种样式的字号都缩小为11px,不过在IE下面看不出11px和12px汉字的区别,但在Firefox下英汉的11px字号都确实被缩小了。
近期评论