存档

‘javascript’ 分类的存档

thickbox手动调用方法

2010年6月12日 没有评论

thickbox手动调用方法

关闭:
parent.tb_remove();

打开:
tb_show(“发表看法”, “#TB_inline?height=125&width=200&inlineId=showPingBaojiaDiv”, null);

分类: javascript, jQuery 标签:

Javascript在IE和Firefox中的兼容分析

2009年9月25日 没有评论
Javascript在IE和Firefox中的兼容分析

1.document.formName.item(“itemName”) 问题

说明:IE下,可以使用document.formName.item(“itemName”)或document.formName.elements["elementName"];Firefox下,只能使用document.formName.elements["elementName"].
解决方法:统一使用document.formName.elements["elementName"]

2.集合类对象问题

说明:IE下,可以使用()或[]获取集合类对象;Firefox下,只能使用[]获取集合类对象.
解决方法:统一使用[]获取集合类对象.
例如:document.getElementsByName(“inputName”)[0]、document.forms["formName"]

3.自定义属性问题

说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;Firefox下,只能使用getAttribute()获取自定义属性.
解决方法:统一通过getAttribute()获取自定义属性.

4.eval(“idName”)问题

说明:IE下,可以使用eval(“idName”)或getElementById(“idName”)来取得id为idName的HTML对象;Firefox下只能使用getElementById(“idName”)来取得id为idName的HTML对象.
解决方法:统一用getElementById(“idName”)来取得id为idName的HTML对象. 例如:document.getElementById(“itemId”)

5.变量名与某HTML对象ID相同的问题

说明:IE下,HTML对象的ID可以作为document的下属对象变量名直接使用;Firefox下则不能.Firefox下,可以使用与HTML对象ID相同的变量名;IE下则不能。
解决方法:使用document.getElementById(“idName”)代替document.idName.最好不要取HTML对象ID相同的变量名,以减少错误;在声明变量时,一律加上var,以避免歧义.

6.const问题

说明:Firefox下,可以使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量. 解决方法:统一使用var关键字来定义常量.

7.input.type属性问题

说明:IE下input.type属性为只读;但是Firefox下input.type属性为读写.

8.window.event问题

说明:window.event只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用.
解决方法: 在触发事件的函数上使用(aEvent)参数,例如下面的
objNode.onmouseover=function(aEvent){
     var myEvent = window.event ? window.event.srcElement : aEvent.target;
     //执行其他动作
}

9.event.x与event.y问题

说明:IE下,even对象有x,y属性,但是没有pageX,pageY属性;Firefox下,even对象有pageX,pageY属性,但是没有x,y属性.
解决方法:使用mX(mX = event.x ? event.x : event.pageX;)来代替IE下的event.x或者Firefox下的event.pageX.

10.event.srcElement问题

说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性.
解决方法:使用obj(obj = event.srcElement ? event.srcElement : event.target;)来代替IE下的event.srcElement或者Firefox下的event.target.

11.window.location.href问题

说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location.
解决方法:使用window.location来代替window.location.href.

12.模态和非模态窗口问题

说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能.
解决方法:直接使用window.open(pageURL,name,parameters)方式打开新窗口。
如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口. 例如:var parWin = window.opener; parWin.document.getElementById(“itemID”).value = “some value”;

13.frame问题,以下面的frame为例:

(1)访问frame对象:
IE:使用window.frameId或者window.frameName来访问这个frame对象.
Firefox:只能使用window.frameName来访问这个frame对象.
另外,在IE和Firefox中都可以使用window.document.getElementById(“frameId”)来访问这个frame对象.

(2)切换frame内容:
在IE和Firefox中都可以使用window.document.getElementById(“testFrame”).src = “xxx.html”或window.frameName.location = “xxx.html”来切换frame的内容.
如果需要将frame中的参数传回父窗口,可以在frme中使用parent来访问父窗口。例如:parent.document.form1.filename.value=”some value”;

14.body问题
Firefox的body在body标签没有被浏览器完全读入之前就存在;而IE的body则必须在body标签被浏览器完全读入之后才存在.

15. nodeName 和 tagName 问题
问题:在MF,IE中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。
解决方法:使用 tagName,但应检测其是否为undefined。

16. url encoding
问题:js中如果书写url就直接写&不要写&例如var url = ‘xx.jsp?objectName=xx&objectEvent=xxx’;
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器,一般会服务器报错参数没有找到;当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
一般MF无法识别js中的&

17.children 与 childNodes,removeNode
问题一:在MF中没有   parentElement parement.children   而用 parentNode parentNode.childNodes
问题二:childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白文本节点。
问题三:一般可以通过node.getElementsByTagName()来回避这个问题。当html中节点缺失时,IE和MF对parentNode的解释不同,例如MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点
问题四:MF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

分类: javascript 标签: , ,

14个顶级的jQuery幻灯与相册插件

2009年9月16日 没有评论
14个顶级的jQuery幻灯与相册插件
2009-01-28 10:39
jQuery现 在越来越被重视,相当多的web2.0网站在采用它来展示其照片库。jQuery效果能够模拟出Flash的效果将一组照片相当优雅地展示在读者面前。下 面我们将为大家介绍14个顶级的jQuery效果。你喜欢的话,可以拿去用在你自己网站的相册上。</div>

galleria
Galleria – Galleria 是一个用js写的相册,算是一个jQuery插件了。它用一段简洁的html代码将照片以画布的形式展开,同时还为你的照片生成缩略图。Galleria 的界面非常友好,你不需要懂得太多代码编写的知识就可以非常容易地使用它。点击<a href=”http://devkick.com/lab/galleria/demo_01.htm” target=”_blank”>这里看看Galleria的演示效果。</div>

jQuery Multimedia Portfolio
jQuery Multimedia Portfolio – 是一个很酷的jQuery插件,它可以将你的照片非常流畅地横向排列出来。更妙的是,它支持多种媒体格式,照片、flv视频甚至MP3音频都可以被它识别 出来。jQuery Multimedia Portfolio会主动判断文件的后缀格式,如果是音频或者视频的话,这个插件可以为其生成一个截图,并将这个截图与其他的照片和谐地排列在一起。图示 为该插件的预览,详细演示请点击此处。</div>

Space Gallery
Space Gallery – 动态地3维展示你的图片,效果看上去像苹果的时空机器一样,很炫!点击<a href=”http://eyecon.ro/spacegallery/” target=”_blank”>这里看详细演示。</div>

jQuery Slider Gallery
jQuery Slider Gallery – 像苹果网页上展示其产品那样,移动滑动块,你希望展示的图片就会随着横向移动。</div>

jQuery jsGallscroll Plugin
jQuery jsGallscroll Plugin – jQuery Gallery Scroller (jqGalScroll)能够制作出带分页的照片展示效果。你可以非常流畅地通过点击按照顺序切换照片,也可以自己点击分页选择你的目标图片。你可以用 这个插件让照片按照水平、垂直或者斜角的方式来切换。</div>

jQuery Cycle Plugin
jQuery Cycle Plugin – 是一个轻量级的幻灯显示插件,要实现它的效果,你需要先安装Torsten Baldes写的InnerFade Plugin,Matt Oakes的<a href=”http://www.matto1990.com/web-design/jquery-plugins/simple-jquery-slideshow/” target=”_blank”>Slideshow Plugin和Benjamin Sterling的<a href=”http://www.benjaminsterling.com/experiments/jqShuffle/” target=”_blank”>jqShuffle Plugin这三个插件。jQuery Cycle Plugin支持鼠标悬停,自动停止,自适应大小,点击触发,渐隐渐现等多种图片切换特效。jQuery Cycle Plugin还支持<a href=”http://jqueryjs.googlecode.com/svn/trunk/plugins/metadata/jquery.metadata.js” target=”_blank”>Metadata Plugin 和 the Easing Plugin这两个插件(可选)。</div>

EO Gallery
EO Gallery – 是一个网页幻灯效果。它基于最基本的jQuery和<a href=”http://codylindley.com/” target=”_blank”>Cody Lindley 的 Thickbox的功能在网页上展示大尺寸图像。EO Gallery符合XHTML 1.0和<a href=”http://jigsaw.w3.org/css-validator/check/referer” target=”_blank”>CSS设计标准。我在Firefox、IE6.0、Safari上测试过EO Gallery,表现很好。它甚至还能在不支持javascript 和 CSS的浏览器上工作,无敌了!
slideViewer
slideViewer – 它能根据你的照片张数生成一个页码表附在幻灯片的底部,每个页码对应一张图片,你可通过点击页码轻松切换图片。</div>

jQuery lightbox plugin
jQuery lightbox plugin – 这个相信大家已经都见识过了,该插件的灵感发源于Lokesh Dhakar的<a href=”http://www.huddletogether.com/projects/lightbox2/” target=”_blank”>LightBox JS。使用这个插件将让你的网页图片已非常优雅轻灵的方式展现在读者面前。</div>

Galleriffic
Galleriffic – 这个jQuery插件为你的照片生成一个精致的缩略图列表,点击缩略图就可以快速查看适当尺寸的预览图了。同时它还提供了原始尺寸图片的下载方式,我觉得用这个插件来制作相册的效果非常好。</div>

pirobox
pirobox -Diego Valobra提供的又一个JS相册脚本。点这里,看看它到底有什么不一样。</div>

jQuery Popeye
jQuery Popeye – 这个插件提供了一个随机展示内嵌图像的脚本。它放大图片的技巧相当聪明。网页设计者无需为放大后的图像专门写一个层,放大后的图像仍旧自然流畅还不影响网 页上其余内容的布局。这对访问者的体验度是很有帮助的。点击<a href=”http://dev.herr-schuessler.de/examples/jquery-popeye/” target=”_blank”>这里看演示。</div>

zoomimage
zoomimage – 这个插件的效果相当时髦还特别体贴。点击缩略图,大图将在内置的弹出窗口中展示,放大后的图像带着一层淡淡的投影和边框,美观极了。点击<a href=”http://hotajax.org/jquery/photos-other-plugins/554-zoomimage-jquery-plugin.html” target=”_blank”>这里看演示及说明。</div>

Dynamic Image Gallery and Slideshow
Dynamic Image Gallery and Slideshow – 这是一个轻量级的相册与幻灯js脚本,总共才3K大小,别看它体积小,它的功能可是相当强大的哦。点击<a href=”http://www.leigeber.com/2008/05/ajax-image-gallery-slideshow/” target=”_blank”>这里看演示。</div>
分类: javascript, jQuery 标签: , , ,

JavaScript 的 parseInt(’08′)问题

2009年7月9日 没有评论

傳說中 JavaScript 的 parseInt(’08′)

眾所周知,parseInt() 是用來把字串轉換成整數的函式,一般來說,只要是數字開頭的字串,都能夠轉換成功,例如 parseInt(’123a’) 的結果為 123,parseInt(’12 34′) 的結果為12。

關於 parseInt() 有個著名的情況,有些人稱為臭蟲,讓各位自己來評斷。

parseInt(’01′) 得出的結果是1,事實上,一直到 07 為止,都能得到預期結果,問題來了,parseInt(’08′) 和 parseInt(’09′) 這兩者運算的結果,都得到0,這是為什麼呢?

主要原因在於 parseInt() 這個函式,本身可以傳遞兩個參數,語法是:

parseInt(string, radix)

第一個參數 string 當然是要轉換為數字的字串,第二個參數 radix 則是要用二進位、還是八進位或十六進位,又或是最熟悉的十進位來解譯這個字串呢?

也就是說,如果 parseInt(‘FF’,16),代表以 16 進位方式來解析FF這個字串,當然得到的結果就是 255 了,同理,parseInt(‘FF’,10) 以 10 進位來解析FF這個字串,根本就不是數字,所以得到的結果會是 NaN。

但大多數人不會特別指定第二個參數,這時 JavaScript 就自動判斷第一個傳遞的參數是否為某種數字型式。

在 JavaScript 眼中,以 0x 開頭的字串,都視為十六進位字串,如果單單是0開頭,第二個字母不是 x,則視為八進位或二進位字串,十六進位使用的字母計有 0-9,A-F,而八進位使用的字母則為 0-7,所以,當發生parseInt(’08′) 又未指定以何種數值型態解析時,JavaScript 以 0 為起頭,接下來的字母又不是 x,那一定是八進位了,但是,八進位裡,怎麼可能有 8 和 9 這兩個字母呢?所以,一定是不合法的字串,於是就傳回 0。

同理,parseInt(’010′) 回傳的值,也不是 10,而是 8,因為 parseInt() 認為 0 開頭,接下來的字母不是 x,而是 1,就以二進位來解析 010 這個字串,所以一切問題都在於以 0 開頭,所造成的誤會。

最好的解決辦法,就是別偷懶,把第二個參數也加進去,例如 parseInt(’08′,10)、parseInt(’010′,10),那就萬無一失了!

分类: javascript 标签: ,

预览待上传的本地图片

2009年3月16日 没有评论

预览待上传的本地图片

上传文件是一种很普通的Web应用,尤其以上传图片更为常见。今天我们就在Web标准的范围内谈谈与这个主题相关的内容(只限前端部分,上传的实现当然就不在此列了),关键词是:Javascript、DOM和Firefox。

表单

先创建一个file表单域,我们需要用它来浏览本地文件。

<form name="form1" id="form1" method="post" action="upload.php"> <input type="file" name="file1" id="file1" /> </form>

试下效果:

判断文件类型

当用户选择了一个图片文件时,我们希望他能马上看到这张图片的缩略图,以便他能确认没有把自己的光屁股照片当作头像传到我们的服务器上^_^。

在预览之前我们还得先判断一下用户选择的是不是一个图像文件,如果他想用一个.rar文件做头像的话我们也需要礼貌地提醒一下。

<form name="form2" id="form2" method="post" action="upload.php"> <input type="file" name="file2" id="file2" onchange="preview()" /> </form>

Javascript函数实现,注意我们使用DOM方法getElementById来访问对象。不要再使用form
和input的name属性来访问对象了,只有IE才这么干。

<script type="text/javascript"> function preview2(){ var x = document.getElementById("file2"); if(!x || !x.value) return; if(x.value.indexOf(".jpg")<0 && x.value.indexOf(".jpeg")<0 && x.value.indexOf(".gif")<0){ alert("您选择的似乎不是图像文件。"); }else{ alert("通过"); } } </script>

试下效果:

这里有一个问题,如果用户选择了名为“fake.jpg.txt”的文件,这段脚本仍旧会认为这是一个合法的图像文件。一个可行的解决方案是先 把文件名转换成小写,再取文件路径的最后4到5位,判断一下文件的扩展名是否确为我们支持的图像文件扩展名。不过这种方案略显笨拙,也没有什么美感可言, 我们换一种方案:用“正则表达式”来判断文件扩展名。

<script type="text/javascript"> function preview3(){ var x = document.getElementById("file3"); if(!x || !x.value) return; var patn = /\.jpg$|\.jpeg$|\.gif$/i; if(patn.test(x.value)){ alert("通过"); }else{ alert("您选择的似乎不是图像文件。"); } } </script>

看看效果(可以自己创建一个“fake.jpg.txt”文件试试):

如果从来没有接触过正则表达式,那这段脚本对你可能会有些晦涩,不妨Google一把,看看是否可以先学习学习这方面的知识。我可以向你保证花四五个小时学点正则表达式会是你最近三个月内作出的最明智选择^_^。

回到这段脚本上来,即使你还看不懂正则表达式那两行,但整段脚本的美感还是很明显的:简洁、直接、语义流畅,这与Web标准关于XHTML的要求是一致的,与Web设计师或开发者天生的“完美”主义也是一致的。

jjww一大段之后,我们转入重点——

预览图片

预览功能的基本设计思路是很清晰的:创建一个img元素,再把文件域的value值赋值给img

元素的src属性。

<form name="form4" id="form4" method="post" action="#"> <input type="file" name="file4" id="file4" onchange="preview4()" /> <img id="pic4" src="" alt="图片在此显示" width="120"/> </form> <script type="text/javascript"> function preview4(){ var x = document.getElementById("file4"); var y = document.getElementById("pic4"); if(!x || !x.value || !y) return; var patn = /\.jpg$|\.jpeg$|\.gif$/i; if(patn.test(x.value)){ y.src = "file://localhost/" + x.value; }else{ alert("您选择的似乎不是图像文件。"); } } </script>

试下效果:

图片在此显示

如果你用的是Firefox(或Opera),可能会发现什么也没有发生。是的,很不幸Firefox的安全策略不允许我们显示一个用户的本地 图像文件。不知道他们为什么要这么做,我个人觉得图像文件并不会造成严重的安全性问题。即使是不久前比较热门的那个会引起Windows崩溃的jpeg文 件,要显示它的前提条件是用户自己选择了这个文件或者你知道这个文件在用户硬盘上的准确路径。所以我想这种策略很可能来自于一个“懒惰”的开发人员,他并 不想多写一些程序来区分这个本地文件是一个图像文件还是一个恶意文件,Firefox对安全性的要求让他们有些过于敏感了。

让Firefox显示本地文件的唯一办法就是修改它的默认安全策略:

  1. 在Firefox的地址栏中输入“about:config
  2. 继续输入“security.checkloaduri
  3. 双击下面列出来的一行文字,把它的值由true改为false

然后你可以再试试上面预览,everything works well!可惜的是我们并不能要求所有的用户都去修改这个值(更不用说修改的过程还挺麻烦),所以这对我们来说毫无意义。我们能做的也许就是接受Firefox不能预览本地图片这种“可笑”的局面。

用DOM来创建对象

在上面的XHTML代码中,我们为了预览图片,事先加入了一个没有设置src的img对象。除去不美观、代码冗余之外,如果用户浏览器不支持 Javascript,他不仅无法使用这个功能,还要接受页面上一个永远不会显示出来的破图。要解决这个问题,我们就需要在“运行时”再生成这个img对 象,途径还是DOM。

<form name="form5" id="form5" method="post" action="#"> <input type="file" name="file5" id="file5" onchange="preview5()"/> </form> <script type="text/javascript"> function preview5(){ var x = document.getElementById("file5"); if(!x || !x.value) return; var patn = /\.jpg$|\.jpeg$|\.gif$/i; if(patn.test(x.value)){ var y = document.getElementById("img5"); if(y){ y.src = 'file://localhost/' + x.value; }else{ var img=document.createElement('img'); img.setAttribute('src','file://localhost/'+x.value); img.setAttribute('width','120'); img.setAttribute('height','90'); img.setAttribute('id','img5'); document.getElementById('form5').appendChild(img); } }else{ alert("您选择的似乎不是图像文件。"); } } </script>

试下效果:

这样就相对比较完美了。我也不解释上面这些DOM方法的具体意义,Google一下什么都有了。DOM和正则表达式一样,都是“包你不悔”的实 用技术,如果你希望更多了解、深入学习、或者顺利实践Web标准,DOM是不可或缺的。从我本人最近的体会来说,Javascript+DOM+CSS蕴 藏着强大的能量,就看你怎么释放它了。

分类: javascript, 杂文 标签: ,