开发跨浏览器javascript常见注意事项


Posted in Javascript onJanuary 01, 2009

一、向表追加行
在以往使用Ajax的经历中,你很可能会使用JavaScript向现有的表中追加行,或者从头创建包含表行的新表。document.createElement和document.appendChiid方法可以使这很容易做到,只需使用document.createElement创建表单元格,再使用document.app-endChild方法将这些表单元格增加到表行。接下来的编辑步骤是使用document.append-
Child将表行增加到表中。
在Firefox、Safari和Opera等当前浏览器中,这样做是可以的。不过,如果使用的是lE,表行则不会在表中出现。更糟糕的是,IE甚至不抛出任何错误,或对表行确实已经追加到表中却不会显示出来的问题提供任何线索。
在这种情况下,解决方法很简单。IE允许将tr元素增加到tbody元素,而不是直接增加到table元素。例如,如果定义一个空表如下:
<table id="myTable">
<tbody id="myTableBody"></tbody>
</table>
向这个表中增加行的正确做法是把行增加到表体,而不是增加到表,如下所示:
var cell=document.createElement("td").appendChild(document.createTextNode("foo"));
vat row=document.createElement("tr").appendChild(cell);
document.getElementByld("myTableBody").appendChiid(row);
辛运的是,这种方法在所有当前浏览器上都能用,也包括IE。如果你养成习惯,总是使用表中的表体,就不用担心这个问题了。
二 通过javascript设置元素的样式
利用Ajax技术,开发人员创建的Web应用可以与服务器无缝地通信,而无需完全页面刷新。但对于A1ax请求,是不会出现这种页面闪烁的,所以用户可能不知道页面上有些数据已经更新。你可能想修改某些元素的样式,指示页面上一些数据已经改变。例如,如果股票的价格已经通过Ajax请求得到了无缝更新,可以加亮显示这支股票的名字。
可以通过JavaScript使用元素的setAttribute方法设置元素的样式。例如,要把span元素中的文本修改为采用红色粗体显示.可以使用setAttribute疗法如下:
var spanElement = document.getElementById("mySpan");
spanElement.setAttribute("style", "font-weight:bold; color:red;");
除了IE、这种方法在当前其他浏览器上都是行得通的。对于IE,解决方法是使用元素style对象的cssText属性来设置所需的样式.尽管这个属性不是标准的,但得到了广泛支持,如下所示:
var spanElement = document.getElementById("mySpan");
spanElement.style.cssText = "font-weight:bold; color:red;";
这种方法在IE和大多数其他浏览器上部能很好地工作,只有Opera除外。为了让代码在所有当前浏览器上都可移植,可以同时使用这两种方法,也就是既使用setAttribute方法,也使用元素style对象的cssText属性,如下所示:
var spanElement = document.getElementById("mySpan");
spanElement.setAttribute("style", "font-weight:bold; color:red;");
spanElement.style.cssText = "font-weight:bold; color:red;";
这样一来,在当前所有浏览器上都能正常地设置元素的样式了。
三、设置元素的class属性
读过前一节后,了解到可以通过JavaScript来设置元素的内联样式,你可能想当然地认为,简单地设置无素的class属件应该是最容易的了。遗憾的是,并不如此。与设置元素内联样式类似,通过JavaScript动态地设置元素的class属性时也存在一些特异性。
你可能已经猜到了,IE是当前浏览器中的一个异类,不过解决方法倒也相当简单。使用Firefox和Safari之类的浏览器时,可以使用元素的setAttribute方法来设置冗素的class属性,如下所示:
var element = document.getElementById("myElement");
element.setAttribute("class", "styleC1ass");
奇怪的是,如果使用setAttribute方法,并指定属性名为class,IE并不会设置元素的class属性。相反,只使用setAttribute方法时IE会自己识别className属性。对于这种情况,完备的解决方法是:使用元素的setAttribute方法时,将class和className都用作属性名,如下所不:
var element = document.getElementById("myElement");
element.setAttribute("class", "styleC1ass");
element.setAttribute("className", "styleC1ass");
当前大多数浏览器都会使用class属性名而忽略className,IE则正好相反。
四、创建输入元素
输入元素为用户提供了与页面交互的手段。HTML本身有一组有限的输入元素,包括单行文本框、多行文本框、选择框、按钮、复选框和单选钮。你可能想使用JavaScfipt动态地刨建这样一些输入元素作为Ajax实现的一部分。
单行文本框、按钮、复选框和单选钮都可以创建为输入元素,只是type属性的值有所不同。选择框和文本区有自己特有的标记。通过JavaScript动态地创建输入元素很简单(但单选钮除外,这在“刨建单选钮”一节再做解释),只要遵循一些简单的规则就行。使用document.createElement方法可以很容易地创建选择框和文本区,只需向document.cr
eateElement传递元素的标记名,如select或textarea。
单行文本框、按钮、复选框和单选钮稍难一些,因为它们都有同样的元素名input,只是type属性的值不同。所以,要创建这些元素,不仅需要使用document.createElement方法,后面还要调用元素的setAttribute方法来设置type属性的值。这并不难,但确实要多加一行代码.
考虑在哪里把新创建的输入元素增加到其父元素中,必须注意document.createElement和setAttribute语句的顺序。在某些浏览器中,只有刨建了元素,而且正确地设置了type属性时,于会把新创建的元素增加到其父元素中。例如,以下代码段存某些浏览器中可能有奇怪的行为:
document.getElementById("formElement").appendChild(button);
button.setAttribute("type", "button");
为了避免奇怪的行为,要确保刨建输入元素后设置其所有属性,特别是type属性,然后再把它增加到父元素中,如下:
var button = document.createElement("input"):
button.setAttribute("type", "button");
document.getElementById("formElement").appendChild(button);
遵循这个简单的规则,有助于消除以后可能出现的一些难于诊断的问题。
五 向输入元素增加事情处理程序
向输入元素增加事件处理程序应该与使用setAttribute方法并指定事件处理程序的名字和所需函数处理程序的名字一样容易,对吗?错。设置元素的事件处理程序的标准做法是使用元素的setAttribute方法,它以事件名作为属性名,并把函数处理程序作为属性值.如下所示:
var formElement = document,getElementById("formElement");
formElement.setAttribute("onclick", "doFoo();");
除了IE上面的代码在所有当前浏览器中都能工作。如果在IE中使用JavaScfipt设置元素的事件处理程序,必须对元素使用点记法来引用所需的事件处理程序,非把它赋为匿名函数,这个匿名函数需要调用所需的事什处理程序,如下所示:
var formElement = document,getElementById("formElement");
formElement.onclick = function() { doFoo(); };
注意,是如何通过点记法从formElement引用onclick事件处理程序。onclick事什处理程序赋为一个匿名函数,这个匿名函数只是调用了所需的事件处理程序.在这个例子中事件处理程序就是doFoo。
幸运的是,这种技术得到了IE和所有其他当前浏览器的支持.所以完全可以通过JavaScfipt动态地设置表单元素的事件处理程序。
六、创建单选按钮
最好的总是留在最后。通过JavaScript动态地创建单选钮是很费劲的,因为IE中创建单选钮的方法与其他浏览器所用的方法大相径庭。
除了IE,当前所有其他浏览器都允许使用以下方法创建单选钮(这些方法应该能想得到):
var radioButton = document.createElement("input");
radioButton.setAttribute("type", "radlo");
radioButton.setAttribute("name", "radioButton");
radioButton.setAttribute("value", "checked");
这样就能在除IE以外的所有当前浏览器中创建单选选钮,而且能正常工作。在lE中,单选钮确实会显示出来.但是无法将其选中,因为点击单选钮行不按我们预想得那样使之选中。在IE中,创建单选钮的方法与其他浏览器所用的方法完全不同,而且根本不兼容。对于前面建立的单选钮,在IE中可以如下建立:
var radioButton = decument.createElement("<input type='radio'
name='radioButton' value='checked'>");
好在,IE中确实可以通过JavaScript动态地创建单选钮,只不过难些,而且与其他浏览器不兼容。
如何克服这个限制呢?答案很简单,这就是需要某种浏览器嗅探(browser-sniffing)机制,使得在创建单选钮时脚本就能知道该使用哪个方法。幸运的是,你不用检查大量不同的浏览器。假设只使用现代浏览器,脚本只需要在IE和其他浏览器间进行区分就行了。
IE能识别出名为uniqueID的document对象的专用属性,名为uniqueID。IE也是惟一能识别这个属性的浏览器,所以uniqueID很适合用来确定脚本是不是在IE中运行。
使用docurnent.uniqueID属性来确定脚本在哪个浏览器中运行时,可以结合IE特定的办法和标准兼容的方法,这就会得到以下代码:
if(document.uniqueID) {
//Internet Explorer
var radioButton = decument.createElement("<input type='radio'
name='radioButton' value='checked'>");
}
else {
//Standards Compliant
var radioButton = document.createElement("input");
radioButton.setAttribute("type", "radlo");
radioButton.setAttribute("name", "radioButton");
radioButton.setAttribute("value", "checked");
}

Javascript 相关文章推荐
一个简单的动态加载js和css的jquery代码
Sep 01 Javascript
jQuery图片特效插件Revealing实现拉伸放大
Apr 22 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
May 16 Javascript
AngularJS中$http服务常用的应用及参数
Aug 22 Javascript
Node.js之网络通讯模块实现浅析
Apr 01 Javascript
用angular实现多选按钮的全选与反选实例代码
May 23 Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 Javascript
JavaScript基础进阶之数组方法总结(推荐)
Sep 04 Javascript
基于JavaScript实现每日签到打卡轨迹功能
Nov 29 Javascript
详解ES7 Decorator 入门解析
Feb 18 Javascript
JS字符串与二进制的相互转化实例代码详解
Jun 28 Javascript
12 种使用Vue 的最佳做法
Mar 30 Javascript
用于判断用户注册时,密码强度的JS代码
Jan 01 #Javascript
很全的显示阴历(农历)日期的js代码
Jan 01 #Javascript
js继承 Base类的源码解析
Dec 30 #Javascript
动态创建的表格单元格中的事件实现代码
Dec 30 #Javascript
javascript FormatNumber函数实现方法
Dec 30 #Javascript
js 图片轮播(5张图片)
Dec 30 #Javascript
走出JavaScript初学困境—js初学
Dec 29 #Javascript
You might like
php smarty 二级分类代码和模版循环例子
2011/06/16 PHP
apache php模块整合操作指南
2012/11/16 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
Python三级菜单的实例
2017/09/13 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
矫正人员思想汇报
2014/01/08 职场文书
职务说明书范文
2014/05/07 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
促销活动总结模板
2014/07/01 职场文书
汽车转让协议书
2015/01/29 职场文书
2015年班组工作总结
2015/04/20 职场文书
本科毕业论文致谢词
2015/05/14 职场文书