2008-09-08 17 views
5

Mã .Net được tạo cho một biểu mẫu có bộ thuộc tính "DefaultButton" chứa javascript kém cho phép chức năng hoạt động trong IE nhưng không có trong các trình duyệt khác (Firefox specifcially).Asp.Net Form DefaultButton Lỗi trong Firefox

Nhập phím nhập sẽ gửi biểu mẫu với tất cả các trình duyệt nhưng Firefox không thể bỏ qua việc bấm phím khi nó xảy ra bên trong điều khiển <textarea>. Kết quả là một điều khiển vùng văn bản nhiều dòng không thể là đa dòng trong Firefox khi phím enter gửi biểu mẫu thay vì tạo một dòng mới.

Để biết thêm thông tin về lỗi, read it here.

Điều này có thể được khắc phục trong Asp.Net 3.0+ nhưng vẫn phải tạo giải pháp thay thế cho 2.0.

Bất kỳ ý tưởng nào về cách giải quyết nhẹ nhất (hack không giống như hack = D)? Giải pháp trong liên kết trên làm tôi sợ một chút vì nó có thể dễ dàng có tác dụng phụ ngoài ý muốn.

Trả lời

4

tôi sử dụng chức năng này chuyển thể từ codesta. [Edit: rất giống, tôi thấy, điều đó làm bạn sợ! Rất tiếc. Không thể giúp bạn sau đó.]

http://blog.codesta.com/codesta_weblog/2007/12/net-gotchas---p.html.

Bạn sử dụng nó bằng cách bao quanh mã của bạn với một div như vậy. Bạn có thể phân lớp Biểu mẫu để tự động bao gồm biểu mẫu này. Tôi không sử dụng nó nhiều, vì vậy tôi đã không.

 
<div onkeypress="return FireDefaultButton(event, '<%= aspButtonID.ClientID %>')"> 
    (your form goes here) 
</div> 

Đây là hàm.

 
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; 
} 
1

Đối với vấn đề này cụ thể, lý do là vì javascript tạo ra bởi ASP.NET 2.0 có một số ký hiệu IE chỉ: event.srcElement không Sẵn có trong FireFox (sử dụng event.target thay):

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; 
} 

Nếu chúng ta thay đổi 2 dòng đầu tiên thành:

function WebForm_FireDefaultButton(event, target) { 
var element = event.target || event.srcElement; 
if (!__defaultFired && event.keyCode == 13 && !(element && 
(element.tagName.toLowerCase() == "textarea"))) { 

Đặt mã thay đổi trong một tập tin và sau đó làm

protected void Page_Load(object sender, EventArgs e) 
{ 
ClientScript.RegisterClientScriptInclude("js1", "JScript.js"); 
} 

Sau đó, nó sẽ hoạt động cho cả IE và FireFox.

Nguồn:

http://www.velocityreviews.com/forums/t367383-formdefaultbutton-behaves-incorrectly.html

3

Dường như codesta.com sửa chữa mà Harpo liên kết đến không còn cần thiết, kể từ khi event.srcElement sửa chữa được không integrade trong ASP.NET 3.5. Tuy nhiên, việc thực thi DefaultButton vẫn có một số vấn đề, bởi vì nó đang đánh dấu phím Enter trong quá nhiều trường hợp. Ví dụ: Nếu bạn đã kích hoạt một nút trong biểu mẫu bằng cách sử dụng tab, nhấn Enter sẽ nhấp vào nút và không gửi biểu mẫu.

Bao gồm mã JavaScript sau ở cuối trang web ASP.NET của bạn để làm cho Enter hoạt động theo cách cần.

// 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; 
} 
Các vấn đề liên quan