2008-09-08 70 views
5

在.NET生成的代碼用於與「DefaultButton」屬性設置一個形式Asp.Net表格DefaultButton錯誤包含差的JavaScript允許功能工作在IE而不是在其他瀏覽器(Firefox specifcially)。在Firefox

點擊回車鍵確實提交表單與所有瀏覽器,但Firefox不能忽視按鍵時,它發生在<textarea>控制。結果是多行文本區域控件不能在Firefox中多行顯示,因爲Enter鍵提交表單而不是創建新行。

有關該錯誤的更多信息,請參閱read it here

這可以在Asp.Net 3.0+中修復,但仍需要爲2.0創建解決方法。

任何想法爲最輕的解決方法(黑客看起來不像hack = D)?上述鏈接中的解決方案讓我有點害怕,因爲它很容易產生意想不到的副作用。

回答

4

我用這個功能改編自codesta。 [編輯:同樣的,我知道,這會嚇到你!哎呀。現在幫不了你了。]

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

你可以像使用div一樣使用它。你可以繼承這個Form來自動包含這個。我不那麼用,所以沒有。

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

對於這個特定的問題,其原因是因爲通過 ASP.NET 2.0生成的JavaScript有一些僅IE符號:event.srcElement不 火狐速效(使用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

3

看起來,harpo鏈接到的修復codesta.com不再是必需的,因爲修訂event.srcElement在ASP.NET 3.5中不是必需的。然而,DefaultButton的實現仍然存在一些問題,因爲它在很多情況下捕獲了Enter鍵。例如:如果您已經在使用標籤的表單中激活了一個按鈕,則按下Enter應該點擊該按鈕並且不提交該表單。

包含在你的ASP.NET Web頁,以輸入行爲的方式應該的底部下面的JavaScript代碼。

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