开发跨浏览器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 相关文章推荐
疯狂Jquery第一天(Jquery学习笔记)
May 11 Javascript
使用Raygun来自动追踪AngularJS中的异常
Jun 23 Javascript
js实现仿Discuz文本框弹出层效果
Aug 13 Javascript
Node.js重新刷新session过期时间的方法
Feb 04 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
jQuery基本过滤选择器用法示例
Sep 09 Javascript
javascript 中模板方法单例的实现方法
Oct 17 Javascript
JS的Ajax与后端交互数据的实例
Aug 08 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
Nov 21 Javascript
如何使用 vue + d3 画一棵树
Dec 03 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
Apr 19 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
May 07 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
PHP5 安装方法
2006/10/09 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
QQ登录简单实现代码
2021/03/09 Javascript
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
python判断windows系统是32位还是64位的方法
2015/05/11 Python
Python生成随机验证码的两种方法
2015/12/22 Python
python将txt文件读取为字典的示例
2018/12/22 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
技术总监个人的自我评价范文
2013/12/18 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server