5

「DefaultButton」属性が設定されたフォームの .Net 生成コードには、機能が IE では機能するが他のブラウザー (特に Firefox) では機能しない貧弱な JavaScript が含まれています。

Enter キーを押すと、すべてのブラウザーでフォームが送信されますが、Firefox は <textarea> コントロール内でキーが押された場合に無視できません。結果は、Enter キーが新しい行を作成する代わりにフォームを送信するため、Firefox では複数行にできない複数行のテキスト エリア コントロールです。

バグの詳細については、こちらをお読みください

これは Asp.Net 3.0+ で修正される可能性がありますが、2.0 用の回避策を作成する必要があります。

最も軽い回避策 (ハック = D のように見えないハック) のアイデアはありますか? 上記のリンクの解決策は、意図しない副作用を簡単に引き起こす可能性があるため、少し怖いです.

4

3 に答える 3

4

私はこの関数を codesta から適応させて使用しています。[編集: なるほど、あなたを怖がらせるのとまったく同じものです! おっとっと。それなら仕方ない。]

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

コードを div で囲んで使用します。Form をサブクラス化して、これを自動的に含めることができます。あまり使わないので使いませんでした。

<div onkeypress="return FireDefaultButton(event, '<%= aspButtonID.ClientID %>')">
    (フォームはこちら)
</div>

これが関数です。

関数 FireDefaultButton(イベント、ターゲット)
{
    // srcElement は IE 用です
    var 要素 = event.target || event.srcElement;

    if (13 == event.keyCode && !(要素 && "テキストエリア" == element.tagName.toLowerCase()))
    {
        var defaultButton;
        defaultButton = document.getElementById(target);

        if (defaultButton && "未定義" != defaultButton.click の種類)
        {
            defaultButton.click();
            event.cancelBubble = true;
            if (event.stopPropagation)
                event.stopPropagation();
            false を返します。
        }
    }
    true を返します。
}
于 2008-09-08T16:12:13.543 に答える
3

event.srcElement の修正は ASP.NET 3.5 に統合されていないため、harpo がリンクする codesta.com の修正は不要になったようです。ただし、DefaultButton の実装にはまだいくつかの問題があります。多くの場合、Enter キーの押下をキャッチしているためです。例: タブを使用してフォーム内のボタンを有効にした場合、Enter キーを押すとボタンをクリックし、フォームは送信されません。

ASP.NET Web ページの下部に次の JavaScript コードを含めて、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;
}
于 2009-09-21T11:21:55.097 に答える
1

この特定の問題の理由は、ASP.NET 2.0 によって生成された JavaScript に 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

于 2008-09-08T16:00:02.107 に答える