不同浏览器引用不同JS

根据浏览器类型,引用相应的JS。即判断是PC浏览器还是手机浏览器。

PC浏览器加载引用cordova.js的页面时,会弹出很多对话框,如下图所示,影响用户体验,而手机上不会出现这种现象,因为phonegap本身就是为了移动终端的web引用调用本地功能而产生的。


这就需要在页面加载时,先判断浏览器类型,如果是PC端的浏览器,则取消引用cordova.js;

在页面中引入下面的js,单独作为一个js文件:judgePlatform.js,,代码如下:

/*
 * 智能机浏览器版本信息:
 *
 */
var browser = {
	versions : function() {
		var u = navigator.userAgent, app = navigator.appVersion;
		return {// 移动终端浏览器版本信息
			trident : u.indexOf('Trident') > -1, // IE内核
			presto : u.indexOf('Presto') > -1, // opera内核
			webKit : u.indexOf('AppleWebKit') > -1, // 苹果、谷歌内核
			gecko : u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, // 火狐内核
			mobile : !!u.match(/AppleWebKit.*Mobile.*/)
					|| !!u.match(/AppleWebKit/), // 是否为移动终端
			ios : !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), // ios终端
			android : u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, // android终端或者uc浏览器
			iPhone : u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, // 是否为iPhone或者QQHD浏览器
			iPad : u.indexOf('iPad') > -1, // 是否iPad
			webApp : u.indexOf('Safari') == -1
		// 是否web应该程序,没有头部与底部
		};
	}(),
	language : (navigator.browserLanguage || navigator.language).toLowerCase()
}
下面写一个demo.html,代码如下:

<html>
    <head>
        <meta charset="utf-8" />
        <meta name="format-detection" content="telephone=no" />
        <!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 -->
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
        <link rel="stylesheet" type="text/css" href="css/index.css" />
        <title>Hello World</title>
		<script type="text/javascript" src="judgePlatform.js"></script>
        <script type="text/javascript">
		
		
		
		txt="<p>语言版本: "+browser.language + "</p>";
		txt+="<p> 是否为移动终端: "+browser.versions.mobile + "</p>";
		txt+="<p> ios终端: "+browser.versions.ios + "</p>";
		txt+="<p> android终端: "+browser.versions.android + "</p>";
		txt+="<p> 是否为iPhone: "+browser.versions.iPhone + "</p>";
		txt+="<p> 是否iPad: "+browser.versions.iPad + "</p>";
		txt+=navigator.userAgent + "</p>";
		document.getElementById("example").innerHTML=txt;
		
		if(browser.versions.mobile){
			document.write("<script type=\"text/javascript\" src=\"cordova.js\"><\/script>"); //为移动设备时则引入cordova.js
		}
			
		document.addEventListener("deviceready", onDeviceReady, false);
		function onDeviceReady() {
				document.addEventListener("pause",onPause,false);
				document.addEventListener("resume",onResume,false);
			document.addEventListener("backbutton", onBackButton, false);
	
		}
		function onPause() {
			alert("pause");
		}
		function onResume() {
			alert("resume");
		}
		function onBackButton() {
			alert("backbutton");
	}
        </script>
    </head>
    <body>
        <div class="app">
            <h1>PhoneGap</h1>
            <div id="deviceready" class="blink"> 
                <div id="example"></div>
            </div>
        </div>             
    </body>
</html>

电脑上运行结果如下:


手机上运行结果如下,


当点手机的返回按钮时,会弹出如下对话框,说明在手机端cordova.js已经引入,并且可用!



<think>首先,用户的问题是关于JavaScript中document.getElementById的兼容性问题,特别是不同浏览器之间的差异。我需要参考提供的引用内容来构建我的回答。关键引用点: -引用[1]:提到在IE中可能返回“未知错误”,而Firefox正常工作。-引用[2]:详细描述了IE6-8的bug,其中name和id相同会导致问题,并提供了解决方案。 -引用[3]:讨论了document.getElementById和document.querySelector的使用,包括兼容性。-引用[4]:指出Firefox只查找id,而IE可能有兼容性问题。用户的问题:"我想在不同浏览器中使用 document.getElementById获取元素值的兼容性或方法差异请问JavaScriptdocument.getElementById兼容性不同浏览器差异" 所以,我需要解释document.getElementById在不同浏览器中的兼容性问题,特别是IE的bug,并提供解决方案。回答结构:1.**介绍document.getElementById**:简要说明其用途。 2. **兼容性问题**:-在IE6-8中,如果元素的name和id属性相同,document.getElementById可能返回name属性的元素而不是id。-Firefox和其他现代浏览器只查找id属性。 3. **解决方案**:-使用一个封装函数来处理兼容性,如引用[2]中所示。-考虑使用document.querySelector,它有更好的支持(但需要检查兼容性)。4.**最佳实践**:建议避免name和id冲突,或使用现代方法。 5. **相关问题**:根据系统指令,生成相关问题。 系统指令要求: -所有行内数学表达式用$...$格式(但这里没有数学内容,所以可能不适用)。-独立公式用$$...$$格式(同样,不适用)。- LaTeX语法正确(不适用)。 -使用中文回答。 -生成相关问题。-在引用的段落末尾添加引用标识,例如[^1]。回答需要结构化,帮助用户逐步解决问题。大纲: 1. **开头**:解释document.getElementById的基本功能。 2. **问题描述**:详细说明IE的兼容性问题。 3. **解决方案**:提供代码示例和解释。 4. **其他方法**:提到document.querySelector作为替代。5.**总结**:给出建议。 6. **相关问题**:生成相关问题。 生成相关问题:-基于主题,如:如何避免兼容性问题?document.querySelector的兼容性如何?其他浏览器兼容性问题示例? 最终回答格式: -用中文。-清晰分段。 -添加引用标识。</think>### JavaScript 中 `document.getElementById` 的浏览器兼容性差异 `document.getElementById` 是 JavaScript 中用于通过 ID 获取 DOM 元素的常用方法。它在不同浏览器中表现基本一致,但存在一些兼容性问题,尤其在较旧版本的 Internet Explorer (IE) 中。以下是逐步分析差异、原因和解决方案,帮助您避免常见错误。 #### 1. **基本功能与兼容性概述** - `document.getElementById(id)` 在所有现代浏览器(如 Chrome、Firefox、Safari)中工作正常:它严格根据元素的 `id` 属性查找元素,如果找不到则返回 `null`。 - 例如,在 Firefox 中,`document.getElementById("test")` 会正确返回 ID 为 "test" 的元素[^1][^4]。 - 问题主要出现在 IE 浏览器中,特别是 IE6-8 版本,存在一个特定 bug。 #### 2. **IE 中的兼容性问题** - **核心问题**:在 IE6-8 中,如果页面中存在元素的 `name` 属性和 `id` 属性值相同,`document.getElementById` 可能错误地返回 `name` 属性匹配的元素,而不是 `id` 属性。这会导致“未知错误”或不预期的结果[^1][^2]。 - 原因:IE 在这些版本中,将 `name` 和 `id` 视为等效标识符,优先返回先出现的属性(通常是 `name`)。 - 示例:假设 HTML 中有 `<input name="test" id="test">`,在 IE8 以下调用 `document.getElementById("test")` 可能返回基于 `name` 的元素,而非 `id`。 - **其他浏览器行为**: - Firefox 和 Chrome 严格区分 `id` 和 `name`,只查找 `id` 属性,无此问题[^4]。 - 现代浏览器(包括 IE9+)已修复此 bug,行为与其他浏览器一致。 #### 3. **解决方案与兼容性处理方法** 为了解决 IE 的兼容性问题,您可以采用以下方法: - **方法 1:封装兼容性函数** 参考引用[^2],创建一个自定义函数来确保跨浏览器兼容性。此函数检查浏览器环境,并在 IE 中手动验证元素的 `id`。 ```javascript function getElementByIdCompat(idValue) { var el = document.getElementById(idValue); // 检测是否为 IE8 以下版本(使用条件编译技巧) if (!+"\v1") { // IE8 以下返回 true,其他浏览器返回 false if (el && el.id === idValue) { return el; // 如果元素存在且 id 匹配,直接返回 } else { // 遍历所有元素,手动查找 id 匹配项 var els = document.all[idValue]; if (els) { for (var i = 0; i < els.length; i++) { if (els[i].id === idValue) { return els[i]; } } } } } return el; // 其他浏览器或未找到时返回 } // 使用示例 var element = getElementByIdCompat("test"); if (element) { console.log(element.innerHTML); } ``` - **原理**:使用 `!+"\v1"` 检测 IE 版本(IE 无法解析 `\v` 为垂直制表符,其他浏览器可以)。在 IE 中,通过 `document.all` 集合遍历元素,确保 `id` 精确匹配。 - **优点**:兼容 IE6-8,且不影响现代浏览器性能。 - **方法 2:使用 `document.querySelector` 作为替代** 现代方法 `document.querySelector("#id")` 在大多数浏览器中支持良好(包括 IE8+),且严格基于 CSS 选择器,避免 `name` 和 `id` 冲突[^3]。 ```javascript // 示例代码 var element = document.querySelector("#test"); if (element) { console.log(element.innerHTML); } ``` - **注意**:`document.querySelector` 在 IE7 及以下不支持,如果需兼容旧 IE,需与方法 1 结合或使用 Polyfill。 - **最佳实践建议**: - 在 HTML 中,避免为同一元素设置相同的 `name` 和 `id` 值。 - 优先使用 `document.querySelector` 或 `getElementById` 封装函数,以确保兼容性。 - 测试时,使用浏览器开发者工具模拟旧版 IE(如 IE 模式)来验证行为。 #### 4. **总结** `document.getElementById` 的兼容性问题主要源于 IE 旧版本的 bug,核心是 `name` 和 `id` 的混淆。通过封装兼容性函数或转向现代 API,您可以轻松解决差异。在开发中,始终考虑浏览器碎片化,并使用特性检测(如 `if (!+"\v1")`)来处理边缘情况[^2][^4]。 如果您有具体代码或浏览器版本细节,我可以进一步分析优化方案!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值