2013-04-03 3 views
0

Я работаю с унаследованным кодом, и я наткнулся на этот кусок искусства:Наследие IE взломать: метка не фокусирование вход

//IE Hacks 
if (navigator.appName == 'Microsoft Internet Explorer') { 
    $("label").live('click', function() { 
     $('#'+$(this).attr('for')).click().click().click(); 
    }); 
} 
// End IE Hacks 

мне сказали, что это было написано, потому что этикетки не всегда работает в IE и этот трюк исправил это. Также он не работал с двумя вызовами .click(), но все три были необходимы.

Используемая версия jQuery - 1.4.2.

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

Я искал Google проблемы с меткой в ​​IE и наткнулся только на проблемы со скрытыми входами.

Кто-нибудь знает, что может быть проблемой, которую решает этот код?

Есть ли более элегантное решение?

UPDATE:

Как вы думаете, это не проблема, этот код мог бы возможно решить, и я должен просто удалить его?

UPDATE 2:

Я нашел проблему с этикетками на сайте. Вот фрагмент HTML:

<div class="remember-me"> 
    <input type="hidden" name="remember" value="0"> 
    <input type="checkbox" id="remember" name="remember" value="1" class="checkbox-input" rel="remember"> 
    <label class="label-remember" for="remember">Keep me logged in</label> 
</div> 

Этот HTML-код вставляется в страницу с помощью Ajax, так что может быть связано с проблемой, описанной в kevmc.

В Internet Explorer 7 щелчок по метке не установлен. Вместо этого он фокусирует ярлык (с тонкой пунктирной рамкой).

+1

Вы просите альтернативное решение проблемы, когда вы даже не знаете, действительно ли существует это ...? – CBroe

+0

@CBroe Я даже не уверен, что является исходной проблемой. Моя текущая проблема - это код, который я не знаю, работает ли он, и я не знаю, как его лучше переписать. –

+0

У вас проблемы с вашей страницей со старыми IE? – CBroe

ответ

2

IE < 8 equates "name" attributes with "id", поэтому щелчок на ярлыке, вероятно, отправляет фокус на скрытый ввод, поскольку он появляется ранее в DOM, и это объясняет, почему флажок не отвечает на щелчки ярлыков в IE7.

Хотя я не уверен, как триггерное событие нажатия три раза решает это, самым изящным решением было бы удалить вход hidden.Однако вход hidden, вероятно, существует до всегда отправляет значение, когда форма отправлена, в отличие от флажков, которые передаются только в том случае, если они успешны (отмечены).

Чтобы решить проблему с меткой фокуса, мы должны изменить разметку, чтобы воспользоваться поведением браузеров по умолчанию, которое заключается в отправке кликов по меткам в их соответствующий элемент формы (по «id»). Таким образом, мы будем держать hidden вход отправить те же параметры в интерфейсе, но изменить id чекбокса и обновить атрибут labelfor, чтобы соответствовать:

<div class="remember-me"> 
    <input type="hidden" id="remember" name="remember" value="0"> <!-- added @id --> 
    <input type="checkbox" id="rememberCB" class="checkbox-input"> <!-- changed @id, removed @name --> 
    <label class="label-remember" for="rememberCB">Keep me logged in</label> <!-- changed @for --> 
</div> 

Примечание: мы удалили name атрибут из ввода флажка, так как мы не хотим включать его значение в представление формы. Вместо этого мы изменим script обновить значение скрытого ввода, когда флажок изменения:

$('#rememberCB').live('change', function() { 
    $('#remember').val($(this).is(':checked') ? '1' : '0'); 
}); 

Таким образом, базовая программа должна получать одни и те же входные параметры, когда форма была отправлена ​​и метка (ы) направит фокус на правильную цель.

Увидеть это в действии здесь: http://jsbin.com/obujoc/6/edit

+0

Ваши замечания полезны, но совершенно не связаны с проблемой. Кроме того, бэкэнд этой системы является настолько полным странным кодом, что я не хочу реорганизовывать вещи, ответственные за обработку формы, которые являются формовыми зданиями, расширениями ORM и контроллерами спагетти. –

+0

Хорошо, я обновил свой ответ. –

+0

Вы понимаете, что скрытый ввод не имеет ничего общего с проблемой? Моя проблема с интерфейсом такая же, если у меня ее нет. Также я не хочу изменять значение скрытого ввода с помощью JS. Проблема, которую все остальные получили почти правильно, заключается в том, что щелчок на ярлыке в старом IE не проверяет флажок и этот уродливый хак, который у меня есть в устаревшем коде. –

2

Когда пачка ярлыков/входных данных добавлена ​​в DOM после загрузки страницы, старые версии IE (я не тестировал ее с IE8), похоже, не распознавали привязку между атрибутами for и id. Что касается элегантного теста, я не знаю ни одного

+0

Моя проблема была связана с переключателями, и поскольку метод щелчка был ненадежным, я вручную установил атрибут checked – kevmc

0

привет, почему вы используете событие click? просто нужно установить фокус! как это:

//IE Hacks 
if (navigator.appName == 'Microsoft Internet Explorer') { 
    $("label").live('click', function() { 
     $('#'+$(this).attr('for')).focus(); 
    }); 
} 
// End IE Hacks 
+0

Он должен сфокусироваться на 'input [type = text]', но он должен проверить 'input [type = radio]' и 'input [тип = флажок] '. –

0

Вы не думаете, хак может быть использован в <!--[if IE]> <![endif]--> теге?

Позвольте мне показать вам пример:

<!--[if IE]> 
    $("label").live('click', function() { 
    $('#'+$(this).attr('for')).focus(); 
}); 
<![endif]--> 

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

+0

Это хорошо, и я могу легко использовать его для конкретной версии IE, но это не решает мою проблему вообще. –

Смежные вопросы