Ключ JavaScript не определен в IE через SSL - PullRequest
1 голос
/ 12 апреля 2011

Я работаю над веб-приложением, которое прекрасно работает внутри локальной сети, используя HTTP, но когда я тестирую его удаленно по SSL, оно не работает для IE (7 и 8).Firefox, Camino и Safari отлично работают.

Я обнаружил, что проблема до key не определена.Соответствующий бит кода:

function showResult(e,str,num) {
    var key = (window.Event) ? e.which : e.keyCode;

    if(((key > 32 && key < 58) || (key > 64 && key < 91) || (key > 95 && key < 123)) && (str.length >= num)) {

Любые подсказки относительно того, почему key будет неопределенным для IE по SSL, но прекрасно работает по HTTP?Еще лучше, может кто-нибудь сказать мне, как преодолеть эту проблему?FWIW, мне не нужно поддерживать IE до версии 7.

Обновление:

Был ответ, который предложил заменить

var key = (window.event) ? e.which : e.keyCode;

с

var key;
e = e || window.event;
key = e.keyCode || e.which;

Это работает.Проблема в том, что я не могу принять этот ответ, потому что он был удален.

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

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

Итак, предлагаемый код такой:

var key;
e = e || window.event;
key = e.keyCode || e.which;

Что делает ||? С одной стороны, это логический оператор или оператор, который возвращает true, если одна из сторон оценивает как boolean true.

Он также используется в JS. Если вы дадите ему два аргумента, а первый не определен, он вернет второй аргумент. Это означает, что в приведенном выше коде, если e не определено, вместо этого вы получите window.event, который является традиционным объектом события IE.

То же самое относится и к e.keyCode || e.which, какой бы ни существовал, используется. Таким образом, в конечном итоге вы получите правильный код ключа в различных браузерах. В стране чудес все хорошо.

Но подождите, ваш оригинальный код не делает что-то подобное?

var key = (window.Event) ? e.which : e.keyCode;

Угу. Что это такое? JavaScript чувствителен к регистру, поэтому window.Event означает , а не так же, как window.event в приведенном выше коде. window.event - это традиционный объект события IE, который вы бы использовали для получения информации о произошедшем событии, в то время как window.Event (который вы можете увидеть из начальной заглавной буквы) является конструктором, или, более конкретно, в данном случае интерфейсом .

Дело в том, что в этом коде он использовался для обнаружения Mozilla. Если он существует, выберите e.which (одно из мест, где Mozilla хранит код ключа), в противном случае перейдите к e.keyCode, где IE будет хранить код ключа.

Однако это основано на ошибочном предположении, что IE не имеет определенного конструктора window.Event. По крайней мере, он определен как IE8. Это означает, что e.which выбирается вместо e.keyCode в более новых версиях IE. e.which никогда и никогда не будет поддерживаться в IE. Вот почему key оказывается неопределенным.

Но, хм, почему они отличаются между зашифрованными и незашифрованными соединениями? Это хороший вопрос. Хотя я не могу знать наверняка без доступа к вашей среде разработки, я бы предположил, что она имеет что-то с режимами совместимости IE.

IE исторически (за последние 10 лет) был самым необычным и нестандартным браузером во всем мире. Это привело к тому, что люди а) программировали невежественно в соответствии со стандартами IE, б) создавали обходные пути для поведения IE. Если бы MS просто сделала IE совместимым со стандартами, это сломало бы много страниц, которые так или иначе зависят от странного поведения IE. Microsoft подтвердила это, заставив IE8 + эмулировать более старые версии IE, чтобы страницы не ломались, если не указано иное.

Я могу только предположить, что по какой-то причине в вашей тестовой среде страница в конечном итоге будет работать в режиме "IE7", в котором может не быть определен конструктор / интерфейс window.Event. Это заставит ваш старый код использовать e.keyCode, что в порядке. Тогда, возможно, в вашей производственной среде, или, может быть, просто из-за зашифрованного соединения (только ghawd знает, что делает MS), вы получите более новый режим IE, так что window.Event фактически определено и e.which выбрано. Это делает IE нахальной обезьяной.

Итог: используйте новый код.

0 голосов
/ 12 апреля 2011

Скорее всего, вы включили сценарий через http (а не https), который не сможет загрузиться, поскольку сама страница безопасна, а включенный файл небезопасен.

...