1

ここstackoverflowには同様の質問がたくさんありますが、うまくいく答えが見つかりません。複数のページで繰り返し使用している Javascript 関数がいくつかあるので、それらを外部ファイルに移動することをお勧めします。しかし、私がそうすると、それらは機能しません。

私が現在(今のところ別々の)外部ファイルに持っている2つの関数は次のとおりです。

function MessageDialog(obj, title, dialogText) {
  //add the dialog div to the page
  $('body').append(String.Format("<div id='messageDialog' title='{0}'><p>{1}</p></div>", title, dialogText));
  //create the dialog
  $('#messageDialog').dialog({
    modal: true,
    resizable: false,
    draggable: false,
    close: function(event, ui) { $('body').find('#messageDialog').remove(); },
    buttons:
      {
        'OK': function() {
          $(this).dialog('close');
        }
      }
  });
}

//Confirmation dialog
function ConfirmationDialog(obj, title, dialogText, okButtonText, cancelButtonText) {
  var confirmed = false;
  if (!confirmed) {
    //add the dialog div to the page
    $('body').append(String.Format("<div id='confirmationDialog' title='{0}'><p>{1}</p></div>", title, dialogText));
    //create the dialog
    $('#confirmationDialog').dialog({
      modal: true,
      resizable: false,
      draggable: false,
      close: function(event, ui) { $('body').find('#confirmationDialog').remove(); },
      buttons:
        {
          $okButtonText: function() {
            $(this).dialog('close');
            confirmed = true;
            if (obj) obj.click();
          },
          $cancelButtonText: function() {
            $(this).dialog('close');
          }
        }
      });
    }
    return confirmed;
}

ConfirmationDialog()イベントから呼び出していOnClientClickます (ASP.NET):

MessageDialog()btnDelIncident_Clickイベントでエラーが発生した場合、コード ビハインドから呼び出されます。

private void DisplayMessageDialog(string msgTitle, string msgText)
{
  StringBuilder msg = new StringBuilder();
  msg.AppendLine("<script type='text/javascript'>");
  msg.AppendFormat("  MessageDialog(this, '{0}', '{1}');" + System.Environment.NewLine, msgTitle, msgText);
  msg.AppendLine("</script>");
  ClientScript.RegisterStartupScript(this.GetType(), "messageDialog", msg.ToString());
}

ConfirmationDialog()(ダイアログは表示されませんが) 呼び出しからエラーは発生しませんが、 MessageDialog()(コード ビハインドからの) 呼び出しにより、Javascript コンソールで「Uncaught ReferenceError: MessageDialog is not defined」が発生します。

<head>タグに2 つの外部 Javascript ファイルを含めています。これらは、jQuery のインクルードの後に​​あります。

<script type="text/javascript" src="/Scripts/ConfirmationDialog.js"></script>
<script type="text/javascript" src="/Scripts/MessageDialog.js"></script>

<script>また、これら 2 つのタグをページの最後に配置しようとしましたが、違いはありませんでした。私は何を間違っていますか?

編集(function($) { });:ニールが提案したように、関数をラップすることでダイアログボックスの問題を解決できました。最終的に機能する関数は次のとおりです (外部の .js ファイルで宣言されています)。

//Confirmation dialog
(function($) {
  var confirmed = false;
  ConfirmationDialog = function(obj, title, dialogText, okButtonText, cancelButtonText) {
    if (!confirmed) {
      //add the dialog div to the page
      $('body').append(String.Format("<div id='confirmationDialog' title='{0}'><p>{1}</p></div>", title, dialogText));
      //create the dialog
      $('#confirmationDialog').dialog({
        modal: true,
        resizable: false,
        draggable: false,
        close: function(event, ui) { $('body').find('#confirmationDialog').remove(); },
        buttons:
        [{
          text: okButtonText,
          click: function() {
              $(this).dialog('close');
              confirmed = true;
              if (obj) obj.click();
           }
         },
         {
           text: cancelButtonText,
           click: function() {
            $(this).dialog('close');
           }
         ]}
      });
    }
    return confirmed;
  };
})(jQuery);
4

2 に答える 2

1

スクリプト タグを外部 JavaScript ファイルに配置したくないことは間違いありません。スクリプト タグは HTML 要素であり、.js ファイルは HTML ではありません。コードをすぐに呼び出される関数式でラップしてみてください。

(function() {

    // your code here    

})();

「クリック」や「ホバー」など、関数呼び出しを DOM ノードのイベントにバインドする場合は、これらのバインドを実行する前に DOM の準備が整っていることを確認する必要があります。jQuery には、これに使用できる .ready() というメソッドがあります。

$(document).ready(function() {
});
于 2013-10-15T23:17:40.797 に答える
0

これは役立つはずです。MessageDialog クライアント側メソッドで要素を参照する前に、DOM がロードされるまで待つ必要があります。

  private void DisplayMessageDialog(string msgTitle, string msgText)
    {
      StringBuilder msg = new StringBuilder();
      msg.AppendLine("<script type='text/javascript'>");
      msg.AppendFormat("jQuery(function($) { MessageDialog(this, '{0}', '{1}'); });" + System.Environment.NewLine, msgTitle, msgText);
      msg.AppendLine("</script>");
      ClientScript.RegisterStartupScript(this.GetType(), "messageDialog", msg.ToString());
    }
于 2013-10-16T05:50:12.233 に答える