一个非常灵异的问题...在IE6 和 FF2.0+ 下代码是正确的, 但在IE7下却没啥反应...

btbtd 2008-05-22 04:17:45
代码如下:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<style type="text/css">
/* <![CDATA[ */

/* ]]> */
</style>
</head>
<body>


<form>
<select id="Sle" multiple="multiple" size="20" >
<option>z</option>
<option>a</option>
<option>b</option>
<option>e</option>
<option>x</option>
<option>d</option>
<option>c</option>
<option>f</option>
<option value="9">cat 9</option>
<option value="10">cat 10</option>
<option value="6">cat 6</option>
<option value="7">cat 7</option>
<option value="8">cat 8</option>
<option value="9">cat 9</option>
<option value="10">cat 10</option>
<option value="6">cat 6</option>
<option value="7">cat 7</option>
<option value="3">cat 3</option>
<option value="8">cat 8</option>
</select><br />
<button type="button" id="UpSort">升序</button>
<button type="button" id="DownSort">降序</button>
</form>

<style type="text/css">
/* <![CDATA[ */

/* ]]> */
</style>

<script type="text/javascript">
//<![CDATA[

var GCount = 1;

var UpSort = document.getElementById("UpSort");
var DownSort = document.getElementById("DownSort");
var Sle = document.getElementById("Sle");

UpSort.onclick = function(e)
{
var Sle = document.getElementById("Sle");
fOptionSortor(Sle, "up");

document.title = GCount++;
};
DownSort.onclick =
function(e)
{
var Sle = document.getElementById("Sle");
fOptionSortor(Sle, "down")

document.title = GCount++;
};

fOptionSortor(Sle, "up");
//fOptionSortor(Sle, "down");

function fOptionSortor(oSelect, sSort)
{/* shawl.qiu code, void return, Func: fStringCompareAlg */
if(!oSelect)return false;
if(!sSort) sSort = 'down';
var o = oSelect.getElementsByTagName('option');

if(sSort == 'up')
{
for(var i = 0; i < o.length; i++ )
{
for(var k = 0; k < o.length; k++ )
{
//alert(o[i].firstChild.data)
if(fStringCompareAlg(o[k].firstChild.data, o[i].firstChild.data)>0)
{
oSelect.insertBefore(o[i], o[k]);
break;
}
}
}
}
else
{
for(var i = 0; i < o.length; i++ )
{
for(var k = 0; k < o.length; k++ )
{
if(fStringCompareAlg(o[k].firstChild.data, o[i].firstChild.data)<0)
{
oSelect.insertBefore(o[i], o[k]);
break;
}
}
}
}
}/* function fOptionSortor(oSelect, sSort) */

function fStringCompareAlg(S1, S2)
{/* shawl.qiu code, return ternary logic(-1, 0, 1)*/
var Re = /[0-9]/;
if(Re.test(S1)&&Re.test(S2))
{
var bHasSamePos = false, S1Len = S1.length, S2Len = S2.length, Len = S1Len;
if(Len<S2Len) Len = S2Len;

for(var i=0; i<Len; i++)
{
if(i>=S1Len||i>=S2Len) break;

var S1Char = S1.charAt(i), S2Char = S2.charAt(i);

if(Re.test(S1Char)&&Re.test(S2Char))
{
var iS1 = parseInt(S1.slice(i)), iS2 = parseInt(S2.slice(i));
var PreS1 = S1.slice(0, i), PreS2 = S2.slice(0, i);

if(PreS1!=PreS2) return S1.localeCompare(S2);
if(iS1>iS2) return 1; else if(iS1<iS2) return -1; else return 0;
}
}
return S1.localeCompare(S2);
}
else{ return S1.localeCompare(S2);}
}/* function fStringCompareAlg(S1, S2) */
//]]>
</script>
</body>
</html>

...全文
320 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfhlyx 2008-05-23
  • 打赏
  • 举报
回复
讨厌IE7。。。。。。。
  • 打赏
  • 举报
回复
指的那个BUG啊,没仔细看你的算法,先回家了,有空再仔细看下
btbtd 2008-05-22
  • 打赏
  • 举报
回复
是的...
升降序难道还要分先后呀...
  • 打赏
  • 举报
回复
你是在不点降序情况下先点升序的BUG?
我测试好象都没错啊!
btbtd 2008-05-22
  • 打赏
  • 举报
回复
22 楼说的是排序算法出错...
不过貌似排序算法没错, 而是DOM 执行延时的问题...
beanming 2008-05-22
  • 打赏
  • 举报
回复
文件编码问题,把文件编码改成utf-8就应该没问题了!!!
  • 打赏
  • 举报
回复
FF1.8.20080.40413这个版本也没有出错
  • 打赏
  • 举报
回复
在什么浏览器下出错?
IE6没有出错
btbtd 2008-05-22
  • 打赏
  • 举报
回复
还有个排序BUG,

比如数据是这样,
<form>
<select id="Sle" multiple="multiple" size="20" >
<option value="3">cat 3</option>
<option value="4">cat 4</option>
<option value="5">cat 5</option>
<option value="6">cat 6</option>
<option value="7">cat 7</option>
<option value="8">cat 8</option>
<option value="2">cat 2</option>
<option value="9">cat 9</option>
<option value="10">cat 10</option>
<option value="11">cat 11</option>
<option value="12">cat 12</option>
<option value="13">cat 13</option>
</select><br />
<button type="button" id="UpSort">升序</button>
<button type="button" id="DownSort">降序</button>
</form>

就出错了...
muxrwc 2008-05-22
  • 打赏
  • 举报
回复
测了我好半天...
最终,我加了个alert(oSelect.innerHTML);发现实质上已经变了,只不过是显示没变...
至于具体是什么导致的没有改变显示,就不去找其原因了...^^

反正单独测试是没有问题的...


单独测试代码如下..

<select id="cs" multiple="multiple">
<option>a</option>
<option>b</option>
</select>

<script type="text/javascript">

var a = document.getElementById('cs');
var d = a.getElementsByTagName('option');
a.insertBefore(d[1], d[0]);
</script>
muxrwc 2008-05-22
  • 打赏
  • 举报
回复
呵呵,完全是select对象的BUG...

在最后面加一个

oSelect.options[0] = oSelect.options[0];
就可以刷新它的显示了..
如果有可能没有[0]
那么判断下


oSelect.options[0] && (oSelect.options[0] = oSelect.options[0]);

^^好啦...
飘走..
muxrwc 2008-05-22
  • 打赏
  • 举报
回复
function fOptionSortor(oSelect, sSort)
{/* shawl.qiu code, void return, Func: fStringCompareAlg */
if(!oSelect)return false;
if(!sSort) sSort = 'down';
var o = oSelect.getElementsByTagName('option');

if(sSort == 'up')
{
for(var i = 0; i < o.length; i++ )
{
for(var k = 0; k < o.length; k++ )
{
if(fStringCompareAlg(o[k].firstChild.data, o[i].firstChild.data)>0)
{
oSelect.insertBefore(o[i], o[k]);
break;
}
}
}
}
else
{
for(var i = 0; i < o.length; i++ )
{
for(var k = 0; k < o.length; k++ )
{
if(fStringCompareAlg(o[k].firstChild.data, o[i].firstChild.data)<0)
{
oSelect.insertBefore(o[i], o[k]);
break;
}
}
}
}
oSelect.options[0] = oSelect.options[0]; //刷新IE7的显示
}/* function fOptionSortor(oSelect, sSort) */
s_liangchao1s 2008-05-22
  • 打赏
  • 举报
回复
没ie7
  • 打赏
  • 举报
回复
按我的理解应该是IE里不支持某一个造成的
如我说的不支持getElementsByTagName,或者在某环境下不支持getElementsByTagName
btbtd 2008-05-22
  • 打赏
  • 举报
回复
这个问题下班后我再看了..
现在手头上还有工作没完成呢........
先闪了..
  • 打赏
  • 举报
回复
不是按妞在IE7也不认吧?
  • 打赏
  • 举报
回复
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1347364&SiteID=1
http://ejohn.org/blog/object-getelementsbytagname-ie7-bug/刚刚查看的
可以看看对你理解有帮助没
btbtd 2008-05-22
  • 打赏
  • 举报
回复
.................:)
btbtd 2008-05-22
  • 打赏
  • 举报
回复
...都说了函数是没问题的...
在页面直接调用是可以的..
放在按钮里就出问题了...
这是不是见鬼呀...
  • 打赏
  • 举报
回复
getElementsByTagName还有这个在IE7里好象有什么BUG吧
查资料看看
加载更多回复(10)

87,995

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧