Почему onChange аварийно завершает работу Internet Explorer 7? - PullRequest
2 голосов
/ 23 декабря 2009

Мы только что выпустили интернет-магазин.

На этой странице selectboxes дает сбой Internet Explorer 7 на некоторых компьютерах. Никогда на моем компьютере. Кто-нибудь знает почему?

Прямая ссылка: http://velour.se/collection/women/tops/eloise Обновление: оказывается, что первое, как я разместил, не вылетело. Но следующее делает: http://velour.se/collection/women/outerwear/irina

Screendump: http://skitch.com/jesperlind/nc4j2/tops-eloise-velour-ie7-bug

Оригинальная версия:

<select id="sizeDD" onchange="javascript:SizeChange(this);"></select>

//Internet Explorer problem.
function SizeChange(e){
    DrawAmountDD(GetAmountById(e.value));
}

Вот фрагмент кода, который, я думаю, может быть задействован:

    function DrawAmountDD(maxAmount){
        /*var max = parseInt(maxAmount) > parseInt(maxShowAmount) ? maxShowAmount : maxAmount;
        var html = "";
        for(var i=1; i <= max; i++){
            html += "<option value='" + i + "'>" + i + "</option>";
        }
        $("#amountDD").html(html);*/

        var max = parseInt(maxAmount) > parseInt(maxShowAmount) ? maxShowAmount : maxAmount;
        var ddlAmount = document.getElementById("amountDD");
        ddlAmount.length=max;

        for(var a=1; a <= max; a++){
            ddlAmount.options[a-1].value = a;
            ddlAmount.options[a-1].text = a;
        }
    }

Версия 2:

<select id="sizeDD"></select>
<select id="amountDD"></select>

<script type="text/javascript">
    var maxShowAmount = '5';
    var colorSizeArr =
      { "colSize":
        [
            { "color": "Black/Offwhite",
              "specificId": "2",
              "size": "XS",
              "amount": "1" }
        ]
      };

    colorSizeArr.colSize.push(
      { "color": "Black/Offwhite",
        "specificId": "13",
        "size": "S",
        "amount": "2" });

    $(document).ready(function () {
        var selectSizeDD = document.getElementById('sizeDD');
        selectSizeDD.onchange = function () { sizeChange(selectSizeDD); };
    });

    function sizeChange(e) {
        DrawAmountDD(GetAmountById(e.value));
    }

    function GetAmountById(specificId) {
        for (var i = 0; i < colorSizeArr.colSize.length; i++) {
            if (colorSizeArr.colSize[i].specificId == specificId) {
                return colorSizeArr.colSize[i].amount;
            }
        }
        return 1;
    }

    function DrawAmountDD(maxAmount) {
        var max = parseInt(maxAmount) > parseInt(maxShowAmount) ? maxShowAmount : maxAmount;
        var html = "";
        for (var i = 1; i <= max; i++) {
            html += "<option value='" + i + "'>" + i + "</option>";
        }
        $("#amountDD").html(html);

    }
</script>

Обновление

Я так и не понял, почему Internet Explorer 7 падает на некоторых компьютерах. В любом случае приведенный выше код не имеет к этому никакого отношения. Это было намного проще. Сбой браузера при нажатии на поле выбора только с одной опцией. Как это:

<select id="amountDD">
<option value="1">1</option>
</select>

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

http://www.akselvoll.net/2007/08/ie7-crashes-when-clicking-on-drop-down.html

Ответы [ 3 ]

1 голос
/ 23 декабря 2009

Надеюсь, под словом «сбой» вы подразумеваете «JavaScript не работает», а не «сбой Internet Explorer». Если это просто страница, вы можете увидеть ошибку, нажав «Ошибка на странице» в строке состояния.
Кроме того, попробуйте некоторую классическую отладку JavaScript - закомментируйте блоки функции по одному, пока не найдете блок, который его сбивает, а затем сузьте его до линии.

1 голос
/ 30 декабря 2009

Я отвечу на это как можно лучше. Если у какого-либо органа есть более подробный ответ, добавьте его, и я отмечу его как принятый.

При некоторых обстоятельствах происходит сбой Internet Explorer 7 из-за ошибки в браузере или системе. У нас были проблемы с HP от Vista. Возможно, Vender установил что-то, что мешало браузеру, например «Вход в систему безопасности HP ProtectTools», как описано здесь: http://social.msdn.microsoft.com/Forums/en/iewebdevelopment/thread/63216546-9289-4345-898c-860d02db7357

Другие возможные варианты описаны здесь: http://www.akselvoll.net/2007/08/ie7-crashes-when-clicking-on-drop-down.html

Простое решение - обновить Internet Explorer до версии 8.

1 голос
/ 23 декабря 2009

Во-первых, префикс javascript: в вашей разметке не нужен. Обработчик будет ожидать, что это код javascript, и я удивлен, что любой браузер на самом деле его анализирует. Обычно вы видите его как тег протокола в атрибуте href, и даже это не очень хороший способ справиться с этим. Во-вторых, параметр функции является ссылкой на элемент DOM (select), атрибут значения которого может или не может быть хорошо поддержан. Хорошая ссылка на HTML / Javascript DOM доступна по адресу http://www.w3schools.com.. См. Ссылку Выбор . Чтобы получить значение, вы можете сделать e.options[e.selectedIndex].value. В-третьих, было бы лучше добавить обработчик через JavaScript.

var select = document.getElementById( 'sizeDD' );
select.onchange = function() { sizeChange(select); };

Или, поскольку теперь я вижу, что вы используете jQuery:

$('sizeDD').change( sizeChange );
...