Javascript не работает в IE

У меня есть фрагмент кода JavaScript, который очень хорошо работает в Firefox и Safari, но отказывается работать в 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?


person fmsf    schedule 02.11.2008    source источник


Ответы (4)


[РЕДАКТИРОВАТЬ] Извините. Я ввел ошибку в своем первом сообщении, не внимательно изучив, как вы строите свой URL. Я не должен был убирать параметр 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 имеет свойство value для выбора. Думаю, нужно добиваться этого через выбранный вариант. Кроме того, я не уверен, что в глобальном пространстве имен есть свойство top, но вы сможете получить к нему доступ через window.top, чтобы указать местоположение. Наконец, я немного улучшил это, указав this в качестве аргумента, вы можете пропустить поиск элемента и ссылаться на него непосредственно из элемента управления, переданного в качестве аргумента.

person tvanfosson    schedule 02.11.2008
comment
Думаю, я исправил это - я пропустил использование id - это глобальная переменная? - поэтому его нельзя было удалять из вызова функции. - person tvanfosson; 02.11.2008

IE не нравится, как вы захватываете значение select

document.getElementById("select1").value

Это говорит: «Дайте мне текст, который находится в атрибуте value выбранного параметра в элементе select с идентификатором select1. Ваши параметры не имеют никаких значений. Когда 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>

Это немного более общий характер, и вы сможете использовать свою функцию для выбора с любым идентификатором.

person Alan Storm    schedule 02.11.2008

Дело не в том, что IE «не имеет .value» элемента ‹select›, дело в том, что вы не указали никаких значений для своих элементов ‹option›. Firefox, Safari и т. Д. скорее всего, защитят вас от этой ошибки. Тем не менее, ваш элемент должен быть построен как:

<select ...>
<option value="Imprimir">Imprimir:</option>
<option value="Ficha de pediatria">Ficha de pediatria</option>
<option value="Ficha normal">Ficha normal</option>
</select>

... и вы увидите более стандартное поведение x-browser для свойства .value ‹select›.

person kamens    schedule 02.11.2008

Я вижу две возможные причины.

1 - способ объявления функции. Я никогда не видел такого, хотя думаю, что это работает.

Возможно, попробуйте следующее и посмотрите, не работает ли это по-прежнему:

function drop(id)
{
    // same code
}

2 - Возврат false в IE не всегда работает должным образом (поверьте мне, это зависит от компьютера). Поэтому вместо возврата 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 иногда бывает странно (часто)


Если эти две функции не работают, по крайней мере, убедитесь, что ваша функция перетаскивания вызывается, поместив туда несколько предупреждений или точек останова, если ваша IDE поддерживает ее для javascript.

person mbillard    schedule 02.11.2008