Asp.Net Ошибка формы DefaultButton в Firefox
Вопрос
Сгенерированный .Net код для формы с установленным атрибутом "DefaultButton" содержит слабый javascript, который позволяет функциональности работать в IE, но не в других браузерах (в частности, Firefox).
Нажатие клавиши enter отправляет форму во всех браузерах, но Firefox не может игнорировать нажатие клавиши, когда это происходит внутри элемента управления <textarea> .В результате получается многострочный элемент управления текстовой областью, который не может быть многострочным в Firefox, поскольку клавиша enter отправляет форму вместо создания новой строки.
Для получения дополнительной информации об ошибке, прочтите это здесь.
Это можно было бы исправить в Asp.Net 3.0+, но для 2.0 все еще необходимо создать обходной путь.
Есть идеи по самому легкому обходному пути (взлом, который не похож на взлом = D)?Решение по приведенной выше ссылке меня немного пугает, поскольку оно легко может иметь непреднамеренные побочные эффекты.
Решение
Я использую эту функцию, адаптированную из codesta.[Править:тот самый, я вижу, который тебя пугает!Упс.Тогда я ничем не могу тебе помочь.]
http://blog.codesta.com/codesta_weblog/2007/12/net-gotchas---p.html.
Вы используете его, окружая свой код div примерно таким образом.Вы могли бы создать подкласс Формы, чтобы включить это автоматически.Я не так уж часто им пользуюсь, поэтому и не стал этого делать.
<div onkeypress="return FireDefaultButton(event, '<%= aspButtonID.ClientID %>')"> (your form goes here) </div>
Вот эта функция.
function FireDefaultButton(event, target) { // srcElement is for IE var element = event.target || event.srcElement; if (13 == event.keyCode && !(element && "textarea" == element.tagName.toLowerCase())) { var defaultButton; defaultButton = document.getElementById(target); if (defaultButton && "undefined" != typeof defaultButton.click) { defaultButton.click(); event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return false; } } return true; }
Другие советы
Похоже, что исправление codesta.com, на которое ссылается harpo, больше не нужно, поскольку fix event.srcElement не интегрирован в ASP.NET 3.5.Однако реализация DefaultButton все еще имеет некоторые проблемы, поскольку она перехватывает нажатие клавиши Enter в слишком многих случаях.Например:Если вы активировали кнопку на вкладке "Использование формы", нажатие клавиши Enter должно привести к нажатию на кнопку, а не к отправке формы.
Включите следующий код JavaScript в нижней части вашей веб-страницы ASP.NET, чтобы заставить Enter вести себя должным образом.
// Fixes ASP.NET's behavior of default button by testing for more controls
// than just textarea where the event should not be caugt by the DefaultButton
// action. This method has to override ASP.NET's WebForm_FireDefaultButton, so
// it has to included at the bottom of the page.
function WebForm_FireDefaultButton(event, target) {
if (event.keyCode == 13) {
var src = event.srcElement || event.target;
if (!(
src
&&
(
src.tagName.toLowerCase() == "textarea"
|| src.tagName.toLowerCase() == "a"
||
(
src.tagName.toLowerCase() == "input"
&&
(
src.getAttribute("type").toLowerCase() == "submit"
|| src.getAttribute("type").toLowerCase() == "button"
|| src.getAttribute("type").toLowerCase() == "reset"
)
)
|| src.tagName.toLowerCase() == "option"
|| src.tagName.toLowerCase() == "select"
)
)) {
var defaultButton;
if (__nonMSDOMBrowser) {
defaultButton = document.getElementById(target);
}
else {
defaultButton = document.all[target];
}
if (defaultButton && typeof (defaultButton.click) != "undefined") {
defaultButton.click();
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return false;
}
}
}
return true;
}
Для этой конкретной проблемы причина в том, что javascript, созданный ASP.NET 2.0, имеет некоторые обозначения только для IE:event.srcElement недоступен в FireFox (вместо этого используйте event.target):
function WebForm_FireDefaultButton(event, target) {
if (!__defaultFired && event.keyCode == 13 && !(event.srcElement &&
(event.srcElement.tagName.toLowerCase() == "textarea"))) {
var defaultButton;
if (__nonMSDOMBrowser) {
defaultButton = document.getElementById(target);
}
else {
defaultButton = document.all[target];
}
if (defaultButton && typeof(defaultButton.click) !=
"undefined") {
__defaultFired = true;
defaultButton.click();
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return false;
}
}
return true;
}
Если мы изменим первые 2 строки на:
function WebForm_FireDefaultButton(event, target) {
var element = event.target || event.srcElement;
if (!__defaultFired && event.keyCode == 13 && !(element &&
(element.tagName.toLowerCase() == "textarea"))) {
Поместите измененный код в файл, а затем выполните
protected void Page_Load(object sender, EventArgs e)
{
ClientScript.RegisterClientScriptInclude("js1", "JScript.js");
}
Тогда это будет работать как для IE, так и для FireFox.
Источник:
http://www.velocityreviews.com/forums/t367383-formdefaultbutton-behaves-incorrectly.html