JavaScriptのよくある互換性問題と関連する解決方法(chrome/IE/firefox)
8044 ワード
まずここで声明します.私のテストブラウザのバージョンはchrome 15.0.874.121 Firefox 8.01 IE 9 Testerです.
以下のコードは声明についてです.
1:スクロールバーを取得した場合
E:文書タイプの説明があると、そのエラーをコメントとして解釈し、Commentノードとして扱います.Dcument.doctypeの値は常にnullです.
Firefox:文書タイプの説明があれば、ドキュメントの第一のサブノードとして、Dcument.doctypeはDcumentTypeノードであり、firstChildまたはchildNodes[0]を介して同じノードにアクセスすることもできる.
Safari、Chrome、Opera:文書タイプの説明があれば、それを解釈としているが、文書のサブノードとしてではなく、childNodesには現れない.
11:元素を探す時、私は本当に分かりません.IEはいつも何をしていますか?システムがブラウザを持参させないなら、IEのシェアはもっと少ないと言える.
IDとnameが同じだったら彼も帰ってきます.
同じIEでも、Idの大文字と小文字は区別しません.
12:カスタム属性であれば、item.mystributsは、IEブラウザ以外の場合、正しい結果が得られない.
Node間の空白文字は、他のブラウザでテキストノードとなり、結果は7となります.こうなったら、
14:セットアップノード問題
16:また、動的にstyleとscriptを追加する場合、IEは他のブラウザとは違っています.具体的に調べる
17:DOM 2とDOM 3については、状況がより複雑になりました.
以下のコードは声明についてです.
1:スクロールバーを取得した場合
function getScroll(){
var t, l, w, h;
if (document.documentElement && document.documentElement.scrollTop) {
t = document.documentElement.scrollTop;//
l = document.documentElement.scrollLeft;//
w = document.documentElement.scrollWidth;// ,
h = document.documentElement.scrollHeight;//
}
else
if (document.body) {
t = document.body.scrollTop;
l = document.body.scrollLeft;
w = document.body.scrollWidth;
h = document.body.scrollHeight;
}
return {
t: t,
l: l,
w: w,
h: h
};
}
2:ビューブラウザの幅の高さを取得します.
function getPageWidth(){
var pageWidth = window.innerWidth;
if (typeof pageWindth != "number") {
if (document.compatMode == "CSS1Compat") {
pageWidth = document.documentElement.clientWidth;
}
else {
pageWidth = document.body.clientWidth;
}
}
return pageWidth;
}
function getPageHeight(){
var pageHeight = window.innerHeight;
if (typeof pageWindth != "number") {
if (document.compatMode == "CSS1Compat") {
pageHeight = document.documentElement.clientHeight;
}
else {
pageHeight = document.body.clientHeight;
}
}
return pageHeight;
}
3:現在のブラウザのモデル名を取得する
function(){
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] : (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
if (Sys.ie != null) {
return ("IE:" + Sys.ie);// IE
}
if (Sys.firefox != null) {
return ("firefox:" + Sys.firefox);// firefox
}
if (Sys.chrome != null) {
return ("chrome:" + Sys.chrome);// chrome
}
if (Sys.opera != null) {
return ("opera:" + Sys.opera);// opera
}
if (Sys.safari != null) {
return ("safari:" + Sys.safari);// safari
}
}
4:イベント傍受
function(element, type, handler){
if (element.addEventListener) {
element.addEventListener(type, handler, false);
}
else
if (element.attachEvent) {
element.attachEvent("on" + type, handler);
}
else {
element["on" + type] = handler;
}
}
5:イベントの削除
function(element, type, handler){
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
}
else
if (element.detachEvent) {
element.detachEvent("on" + type, handler);
}
else {
element["on" + type] = null;
}
}
6:イベントを獲得し、Firefoxイベントが次々と配布された時、初めてのイベントに問題が発生します.
function(event){
event = (event ? event : window.event);
if (event == null) {
var $E = function(){
var c = $E.caller;
while (c.caller)
c = c.caller;
return c.arguments[0]
};
__defineGetter__("event", $E);
}
return event;
}
7:デフォルトイベントを阻止する
function(event){
if (event.preventDefault) {
event.preventDefault();
}
else {
event.returnValue = false;
}
}
8:イベントを継続しない
function(event){
if (event.stopPropagation) {
event.stopPropagation();
}
else {
event.cancelBubble = true;
}
}
9:イベントを獲得したターゲット
function(event){
return event.target || event.srcElement;
}
10:documen.doctypeサポートが不一致です.E:文書タイプの説明があると、そのエラーをコメントとして解釈し、Commentノードとして扱います.Dcument.doctypeの値は常にnullです.
Firefox:文書タイプの説明があれば、ドキュメントの第一のサブノードとして、Dcument.doctypeはDcumentTypeノードであり、firstChildまたはchildNodes[0]を介して同じノードにアクセスすることもできる.
Safari、Chrome、Opera:文書タイプの説明があれば、それを解釈としているが、文書のサブノードとしてではなく、childNodesには現れない.
11:元素を探す時、私は本当に分かりません.IEはいつも何をしていますか?システムがブラウザを持参させないなら、IEのシェアはもっと少ないと言える.
IDとnameが同じだったら彼も帰ってきます.
<br> var item=document.getElementById("my");
<br> item.value="SECOND";
<br>
<br>
IEでは結果が変化した.同じIEでも、Idの大文字と小文字は区別しません.
<br> var item=document.getElementById("MY");
<br> item.value="SECOND";
<br>
<br>
すみません、彼の結果はまた変わりました.12:カスタム属性であれば、item.mystributsは、IEブラウザ以外の場合、正しい結果が得られない.
function(item,myatt){
return item.attributes[myatt].value;
}
同じなら、属性を設定するなら、どうすればいいか分かりますよね.
function(item,myatt,value){
item.attributes[myatt].value=value;
}
13:要素のサブノードの個数
- first
- second
- third
IEの結果は3で、他のブラウザは7です.Node間の空白文字は、他のブラウザでテキストノードとなり、結果は7となります.こうなったら、
- first
- second
- third
これでみんなの結果は3です.14:セットアップノード問題
// Element,
var newnode=document.createElement("input");
newnode.type="button";
newnode.value="sixth";
// IE
var newnode= document.createElement("");
15:右ボタンを遮断する時、firefoxは他のものと違って、oncontextmenuイベント中です.16:また、動的にstyleとscriptを追加する場合、IEは他のブラウザとは違っています.具体的に調べる
17:DOM 2とDOM 3については、状況がより複雑になりました.