今天研究KISSY1.3 RC源代码时看到这样一段代码,如下:
代码的作用是解决一个IE6,7,8版本的bug。
可以通过下面的例子发现问题
在IE下执行这段的代码会发现
<a href='#' id='a'>www.aa</a>
被改成
<a href='http://docs.kissyui.com' id='a'>http://docs.kissyui.com</a>
a标签的text也被替换掉了。经过测试发现,一般text的值中有.和@等字符会被错误替换。
当a标签内嵌套有其他标签时则不会出现这种问题。
KISSY的实现就是利用了当a标签内有嵌套其他标签则不会出现BUG的特性。
if (IE_VERSION && IE_VERSION < 9) {
// https://github.com/kissyteam/kissy/issues/198
// http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/aa6bf9a5-0c0b-4a02-a115-c5b85783ca8c
// http://gabriel.nagmay.com/2008/11/javascript-href-bug-in-ie/
// https://groups.google.com/group/jquery-dev/browse_thread/thread/22029e221fe635c6?pli=1
var hrefFix = attrHooks[HREF] = attrHooks[HREF] || {};
hrefFix.set = function (el, val, name) {
var childNodes = el.childNodes,
b,
len = childNodes.length,
allText = len > 0;
for (len = len - 1; len >= 0; len--) {
if (childNodes[len].nodeType != NodeType.TEXT_NODE) {
allText = 0;
}
}
if (allText) {
b = el.ownerDocument.createElement('b');
b.style.display = 'none';
el.appendChild(b);
}
el.setAttribute(name, EMPTY + val);
if (b) {
el.removeChild(b);
}
};
}
代码的作用是解决一个IE6,7,8版本的bug。
可以通过下面的例子发现问题
<body>
<a href='#' id='a'>www.aa</a>
</body>
<script type="text/javascript">
document.getElementById("a").href='http://docs.kissyui.com';
</script>
在IE下执行这段的代码会发现
<a href='#' id='a'>www.aa</a>
被改成
<a href='http://docs.kissyui.com' id='a'>http://docs.kissyui.com</a>
a标签的text也被替换掉了。经过测试发现,一般text的值中有.和@等字符会被错误替换。
当a标签内嵌套有其他标签时则不会出现这种问题。
KISSY的实现就是利用了当a标签内有嵌套其他标签则不会出现BUG的特性。