我有一个在Firefox和Safari上运行良好的JavaScript代码段,但拒绝在IE上运行:
var drop= function(id)
{
if(document.getElementById("select1").value == "Ficha de pediatria"){
top.location.href = "print.jsp?id="+id+"&type=2";
}
else if(document.getElementById("select1").value == "Ficha normal"){
top.location.href = "print.jsp?id="+id+"&type=1";
}
}
<select id="select1" name="select1" onChange="drop(id);return false;">
<option>Imprimir:</option>
<option>Ficha de pediatria</option>
<option>Ficha normal</option>
</select>
我对此有所了解,因为它有更多的JSP代码,但它仍然保持不变。任何人都知道为什么它不在IE上运行?
答案 0 :(得分:5)
[编辑]抱歉。我在第一篇文章中介绍了一个错误,没有仔细查看你是如何构建你的网址的。我不应该删除id
参数。我已经更新了代码,现在应该可以使用了。
请改为尝试:
function drop(ctl,id)
{
var value = ctl.options[ctl.selectedIndex].value;
if(value == "Ficha de pediatria"){
window.top.location.href = "print.jsp?id="+id+"&type=2";
}
else if (value == "Ficha normal"){
window.top.location.href = "print.jsp?id="+id+"&type=1";
}
}
<select id="select1" name="select1" onChange="drop(this,id);return false;">
<option>Imprimir:</option>
<option>Ficha de pediatria</option>
<option>Ficha normal</option>
</select>
[编辑]一点解释......
我认为问题在于它是如何访问DOM的。我认为IE在select上没有value属性。我认为你必须通过选择的选项获得它。此外,我不确定全局命名空间中是否存在顶级属性,但您应该能够通过window.top
获取该位置以设置位置。最后,我通过指定this
作为参数略微改进,你可以跳过元素查找并直接从作为参数传递的控件引用它。
答案 1 :(得分:3)
IE不喜欢你抓住选择
的价值的方式document.getElementById("select1").value
这就是说“给我带有id select1 的select元素中所选选项的value属性中的文本。你的选项没有任何值。当Firefox和Safari遭遇时这种歧义,他们返回所选选项的文本。当Internet Explorer遇到这种歧义时,它会返回一个空白字符串。如果你做了像
这样的事情你的javascript将会工作<select id="select1" name="select1" onChange="drop(this,id);return false;">
<option value="Imprimir:">Imprimir:</option>
<option value="Ficha de pediatria">Ficha de pediatria</option>
<option value="Ficha normal">Ficha normal</option>
</select>
如果无法做到这一点,您将需要获取所选选项的文本。
var theSelect = document.getElementById("select1");
var theValue = theSelect.options[theSelect.selectedIndex].text
最后,虽然不是您的直接问题,但硬编码 select1 并不是获取选择列表的最佳方式。请考虑使用此关键字
function foo(theSelect){
alert(theSelect.options);
}
...
<select id="whatever" onchange="foo(this);">
...
</select>
这是更通用的,您将能够在具有任何ID的选择上使用您的功能。
答案 2 :(得分:1)
并不是IE“没有.value”的&lt; select&gt;元素,就是你没有为&lt; option&gt;指定任何值元素即可。 Firefox,Safari和co。可能会保护你免受这个错误的影响。尽管如此,您的元素应该构造为:
<select ...>
<option value="Imprimir">Imprimir:</option>
<option value="Ficha de pediatria">Ficha de pediatria</option>
<option value="Ficha normal">Ficha normal</option>
</select>
...您将看到&lt; select&gt;的.value属性的更多标准x浏览器行为。
答案 3 :(得分:-4)
我看到两个可能的原因。
1 - 声明函数的方式。我从来没有见过它,虽然我猜它有用。
也许尝试以下操作,看看它是否仍然有效:
function drop(id)
{
// same code
}
2 - IE中的返回false并不总是正常运行(相信我,这取决于计算机)所以不要返回false,请尝试:
onChange="drop(id);event.returnValue=false;return false;"
如果可能的话,创建一个像这样的方法:
function CrossBrowserFalse()
{
if(IE) // use whatever you want to detect IE
{
event.returnValue = false;
}
return false;
}
然后在你的方法中你可以使用:
onChange="drop(id);return CrossBrowserFalse();"
...是的,IE有时候很常见(经常)
如果这两个失败,至少要确保你的drop函数是通过在那里放置一些警报或断点来调用的,如果你的IDE支持javascript的话。