saber 酱的抱枕

Fly me to the moon

03/3
2017
学习

在JavaScript中使用document.all来判断是否是IE浏览器

今天看到一个代码,通过document.all函数判断浏览器是否是IE。代码大致是这样的:

 if (document.all){
 	// 是IE
 }else{
 	// 不是IE
 }

这里面有个有意思的地方。

document.all函数会返回页面上所有html元素的集合,现在主流浏览器均支持,比如在chrome中执行一下:

在JavaScript中使用document.all来判断是否是IE浏览器

在返回的集合中包含了页面上所有的html元素。

那么问题来了,既然chrome也支持这个函数,结果也不为空,这样判断时不应该是true吗?

试一下将其转换为布尔值,结果竟然是false!惊了!

在JavaScript中使用document.all来判断是否是IE浏览器

其实,在IE之外的浏览器里,运行 typeof document.all ,得到的都是结果都是undefined。而在IE里就是object。

这个现象是有历史原因的。document.all最早是由IE4实现的,当时很多程序猿就通过document.all来判断是否是IE浏览器。后来其他浏览器也实现了document.all,但是又不想被旧程序判断为IE浏览器,所以就把document.all的类型设置为undefined了。

这样,在IE之外的浏览器里判断document.all就会得到false了。

ps:IE11里判断document.all也是false了,所以此方法已经不可靠。

在JavaScript中使用document.all来判断是否是IE浏览器

11/16
2016
学习

在低版本IE浏览器上实现getElementsByClassName()方法

javascript中的document.getElementsByClassName()方法是很实用也很常见的DOM选择器方法,然而IE8及以下版本的IE浏览器并不支持此方法(IE8都支持querySelector()方法了,却不支持getElementsByClassName()方法,实在匪夷所思)。

下面的代码可以在低版本IE浏览器中实现一个document.getElementsByClassName()方法。

if (!document.getElementsByClassName) {
	document.getElementsByClassName = function(className, element) {
		var children = (element || document).getElementsByTagName('*');
		var elements = new Array();
		for (var i = 0; i < children.length; i++) {
			var child = children[i];
			var classNames = child.className.split(' ');
			for (var j = 0; j < classNames.length; j++) {
				if (classNames[j] == className) {
					elements.push(child);
					break;
				}
			}
		}
		return elements;
	};
}

加入这份代码之后,就可以正常使用document.getElementsByClassName()方法了。

(也许遍历所有HTML标签开销比较大←_← 只要求兼容到IE8的话尽情的使用querySelector()方法和querySelectorAll()方法吧)

在低版本IE浏览器上实现getElementsByClassName()方法

11/1
2014
学习

js出错排查的一些注意事项

最近做的网站,都已经上线了,但是同事的百度浏览器用兼容模式查看发现superslide没有生效,原本应该是滚动显示的banner图一张张竖着排了下来。后来用ietester的ie8模式重现了此问题。虽然确实从代码上找出了些问题,但还是让我感叹低版本ie8的纠错容错能力太差了。

1.需要的js是否都加载了
2.有无语法错误,例如js被注释,或js最后的结束标记复制的时候留在了原地,导致标签错误
3.jq放在所有js的最前面
4.查看是否引用了多个jq,如头部模板引入了一个,底部模板又引入了一个(即使是同一个jq文件),保留一个就行
5.如果底部有很多乱七八糟的js,例如广告的、统计的,那么把我们直接用script标签写出的js代码移到底部前面去,以免受到其影响。
6.如果有些选择器已经不存在了,删除对应的js代码。例如首页有两个地方用到了supersild,二级页面却只用了一个。如果直接复制第一个页面的js代码到二级页面,那么第二个元素不存在,ie就会报错。
7.如果怀疑有js和jq有冲突,可以试下用稍低版本的jq,或者把js一个个删除排查。
8.也许可以试试在页面头部添加之类的玩意,死马当做活马医,这类玩意参数很多,具体可百度。

js出错排查的一些注意事项

10/30
2014
学习

jquery并非越新越好——为了兼容性

最近做的网站引用了SuperSlide,其需要jq的支持,于是我不假思索下载了2.0.3版本的jq。这是个比较新的版本,现在项目都快上线了,有个同事用360极速浏览器的兼容模式查看,发现SuperSlide没有生效。后来我就拿ie8实验,在ietest里用ie8模式打开此网页后,不断报错:

这个大概是jq根据SuperSlide的指令执行操作被浏览器报错

这个是SuperSlide使用的jquery()方法不起效

去你妹的吧,在各种百度各种尝试,浪费最少半小时之后,忽然想到以前一件事情,某投资网站根据用户输入的数值来计算相应的其他值,我当时也是把jq换成新版本就报错了。只是我这里chrome里面没报错,只有ie8有问题,果断把jq换成百度cdn的1.9,世界清静了,又用I6模式看了下,连IE6都给我跪下了爆裂吧IE!!!就你们IE和系统捆绑紧,xp的ie只能到ie8,诚心找事啊

jquery并非越新越好——为了兼容性

10/27
2014
软件

IE10 for win7离线安装包下载

我这台电脑是装机的人给装的系统,是非原版系统了,后来想把ie8更新到ie10,但是从百度下的ie10在线安装和微软下的离线安装包都报错,真是跪了,后来在下载吧找到了可用的安装包。

32位安装包下载 64位安装包下载

安装包说明:
1、整合安装IE10所必需的补丁,可独立离线安装;
2、禁止勾选IE10自动安装新版本;
3、禁止首次运行IE10弹出自定义设置对话框。

只是有两点要提前注意:第一,安装过程中有个在屏幕上始终置顶的小提示框,无法关闭;第二安装完后可能会有个窗口问你是否设置XXX为主页,不勾选就行了。

IE10 for win7离线安装包下载

09/30
2014
软件

WIN7在桌面显示隐藏IE图标的方法


刚才逛7吧看到一坟贴,楼主问他把桌面的ie图标删了,怎么恢复出来,而且不要发送快捷方式的这样(当然正版win7桌面是没有IE图标的,又是G版装机)。我工作的这台电脑也是一样,原本桌面有ie图标,我给删了,我就想试试帖子里说的方法。这是用的注册表方法,复制以下代码另存为一个reg文件,双击导入,之后再刷新桌面就能看到ie图标了。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{00000000-0000-0000-0000-100000000001}]
@="Internet Explorer"

[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}]
@="Internet Explorer"

[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\DefaultIcon]
@="C:\\Windows\\System32\\ieframe.dll,-190"

[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell]
@=""

[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\NoAddOns]
@="无加载项(&N)"

[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\NoAddOns\Command]
@="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" -extoff"

[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\Open]
@="打开主页(&H)"

[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\Open\Command]
@="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\""

[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\Set]
@="属性(&R)"

[HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-100000000001}\shell\Set\Command]
@="\"C:\\Windows\\System32\\rundll32.exe\" C:\\Windows\\System32\\shell32.dll,Control_RunDLL C:\\Windows\\System32\\inetcpl.cpl"

如果想要删除这个图标,可以尝试把以下代码保存为reg文件导入注册表。

Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{86AEFBE8-763F-0647-899C-A93278894D8F}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{ADCB47F7-5074-4971-8B5E-CA46E23D7B08}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{e17d4fc0-5564-11d1-83f2-00a0c90dc849}]

导入注册表后刷新桌面,如果没反应,注销或者重启一下。如果图标还没有消失,那就需要进注册表手动删除了。

进入注册表,展开到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\之下,然后一个个点击里面的项目,找到右侧值为Internet Explorer的一项,删除该值。

之后注销或重启电脑,IE图标就消失了。但在此之后,上面显示IE的注册表值就不会再生效了。

WIN7在桌面显示隐藏IE图标的方法