内联Javascript移动到外部文件时出错-如何修复此问题?

内联Javascript移动到外部文件时出错-如何修复此问题?,javascript,jquery,asp.net,Javascript,Jquery,Asp.net,关于stackoverflow,这里有几十个类似的问题,但我找不到一个有效的答案。我有几个Javascript函数,在多个页面中重复使用,所以我认为将它们移动到外部文件是个好主意。但当我这样做的时候,它们就不起作用了 以下是我目前在外部文件(单独,暂时)中拥有的两个函数: function MessageDialog(obj, title, dialogText) { //add the dialog div to the page $('body').append(String.For

关于stackoverflow,这里有几十个类似的问题,但我找不到一个有效的答案。我有几个Javascript函数,在多个页面中重复使用,所以我认为将它们移动到外部文件是个好主意。但当我这样做的时候,它们就不起作用了

以下是我目前在外部文件(单独,暂时)中拥有的两个函数:

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()
调用中得到错误(尽管对话框没有出现),但是
MessageDialog()
调用(来自代码隐藏)会在Javascript控制台中导致“未捕获引用错误:未定义MessageDialog”

我在
标记中包含了两个外部Javascript文件,它们位于jQuery之后,包括:

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

您肯定不想在外部JavaScript文件中放置脚本标记。脚本标记是HTML元素,而.js文件不是HTML。尝试将代码包装到立即调用的函数表达式中:

(function() {

    // your code here    

})();
如果要将函数调用绑定到DOM节点上的事件,例如“单击”或“悬停”,则应确保在执行这些绑定之前DOM已准备就绪。jQuery有一个名为.ready()的方法,可用于:

$(document).ready(function() {
});

您肯定不想在外部JavaScript文件中放置脚本标记。脚本标记是HTML元素,而.js文件不是HTML。尝试将代码包装到立即调用的函数表达式中:

(function() {

    // your code here    

})();
如果要将函数调用绑定到DOM节点上的事件,例如“单击”或“悬停”,则应确保在执行这些绑定之前DOM已准备就绪。jQuery有一个名为.ready()的方法,可用于:

$(document).ready(function() {
});

这应该会有所帮助。在引用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());
    }
private void DisplayMessageDialog(字符串msgTitle,字符串msgText)
{
StringBuilder msg=新的StringBuilder();
msg.AppendLine(“”);
AppendFormat(“jQuery(函数($){MessageDialog(this,{0}',{1}');}”);”+System.Environment.NewLine,msgTitle,msgText);
msg.AppendLine(“”);
RegisterStartupScript(this.GetType(),“messageDialog”,msg.ToString());
}

这应该会有所帮助。在引用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());
    }
private void DisplayMessageDialog(字符串msgTitle,字符串msgText)
{
StringBuilder msg=新的StringBuilder();
msg.AppendLine(“”);
AppendFormat(“jQuery(函数($){MessageDialog(this,{0}',{1}');}”);”+System.Environment.NewLine,msgTitle,msgText);
msg.AppendLine(“”);
RegisterStartupScript(this.GetType(),“messageDialog”,msg.ToString());
}

他肯定是指在页面底部包含2个外部脚本,而不是将脚本元素添加到js中files@Daniel沃德:啊,是的,我想你是对的:-)也许我读得太快了。干杯--n@NeilGirardi我尝试了你的建议,现在出现了确认对话框,但按“确定”按钮没有任何作用-对话框只是停留在那里,而不是继续执行ASP.NET按钮的OnClient单击操作。另一个问题是,对话框上的按钮实际上有“$okButtonText”和“$cancelButtonText”,而不是我在函数中传递的文本。好的,我对它进行了更多的操作,使它大部分工作正常。我将更新我的原始问题,以显示我更改了什么。剩下的唯一问题是确认对话框中我的按钮上的文本是错误的-按钮文本字面上是“okButtonText”和“cancelButtonText”。有什么方法可以让它显示我传递给函数的值而不是变量名吗?我终于弄明白了——对话框上的按钮没有正确声明(我很惊讶它们居然工作了!)。它们必须声明为数组:
按钮:[{text:okbuttonext,click:function(){whatever;}}]
。我将用更正的代码更新我的原始问题。我要感谢尼尔·吉拉迪对我最初的问题的回答,这就是我找到解决办法的原因。谢谢大家!很确定他指的是在页面底部包含2个外部脚本,而不是将脚本元素添加到js中files@Daniel沃德:啊,是的,我想你是对的:-)也许我读得太快了。干杯--n@NeilGirardi我尝试了你的建议,现在出现了确认对话框,但按“确定”按钮没有任何作用-对话框只是停留在那里,而不是继续执行ASP.NET按钮的OnClient单击操作。另一个问题是,对话框上的按钮实际上有“$okButtonText”和“$cancelButtonText”,而不是我在函数中传递的文本。好的,我对它进行了更多的操作,使它大部分工作正常。我将更新我的原始问题,以显示我更改了什么。剩下的唯一问题是确认对话框中我的按钮上的文本是错误的-按钮文本字面上是“okButtonText”和“cancelButtonText”。有什么方法可以让它显示我传递给函数的值而不是变量名吗?我终于弄明白了——对话框上的按钮没有正确声明(我很惊讶它们居然工作了!)。它们必须声明为数组:
按钮:[{text:okbuttonext,click:function(){whatever;}}]
。我将用更正的代码更新我的原始问题。我要感谢尼尔·吉拉迪对我最初的问题的回答,这就是我找到解决办法的原因。谢谢大家!