【问题标题】:JavaScript questionJavaScript 问题
【发布时间】:2009-12-30 22:41:12
【问题描述】:

使用onclick调用js函数...

onclick="SubmitAge(66, 'ctl00_MainContent_arTo_upAgeRange')" 

函数只是从客户端调用一个 updatePanel...但它的说对象应该在 onclick= 部分!!!

这里是函数,代码有什么问题吗?

function SubmitAge(age, UpdatePanelID) {
    $get('HiddenAge').value = age;
    __doPostBack(UpdatePanelID);
}

编辑:提交功能位于 .JS 文件 (AGERANGE.JS) 中,只有在移到此处时它才会停止工作:这是来自 ASCX 用户控件的链接方法/标头,其中包含所有内容...

%@ Control Language="VB" ClassName="AgeRange" %

%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="AjaxCT" %

script src="AgeRange.js" type="text/javascript" /script

(此处删除箭头标签,因为它不会显示,提示:stackoverflow!!!)

我正在从服务器打印它...

Public Sub AppendToSB(ByRef sb As StringBuilder, ByVal CurNo As Byte, Optional ByVal clickedNo As Byte = 0)
    Dim sConfirmClick = ""

    If clickedNo = CurNo Then   ' maybe dont make it clickable...
        sConfirmClick = "return confirm('The number " & CurNo.ToString & " is already selected, are you sure you want to select it again?');"
    End If

    sb.Append("<a href=""#"" onclick=""" & sConfirmClick & "SubmitAge(" & CurNo.ToString & ", '" & upAgeRange.ClientID &
     "')"" runat=""server"">" & CurNo.ToString & "</a>")

End Sub

【问题讨论】:

  • 问题是这部分... onclick="SubmitAge(66, 'ctl00_MainContent_arTo_upAgeRange')" (这是打印在客户端源
  • 这真的和 asp.net、C#、Ajax 或 vb.net 有关系吗?
  • 根据问题的上下文,这可能是 ASP.NET 服务器标记、JavaScript/HTML 语法和 C#/VB.NET 语法之间的语法混淆。我们得先看看更多代码。
  • 这一切都打印在 html 源代码中,就像我在 Internet Explorer 中做的视图源一样...@matrixfrog...我正在使用 vb/c# asp.net & ajax (updatepanel)这一切都取决于我得到的问题
  • JavaScript函数定义在哪里?在同一个页面?在引用的 JS 文件中?如果找不到 SubmitAge 方法,则可能会发生此错误,因此它本身将为 null。

标签: asp.net javascript ajax


【解决方案1】:

经过多次澄清后完全重写我的帖子:

问题在于 ASPX 页面引用了位于不同文件夹中的 ASCX 用户控件。该 ASCX 控件有一个 HTML &lt;script&gt; 标记,该标记使用 JS 文件的相对路径。

解决方案是通过使用一些额外的代码来正确解析 JS 文件的 URL:

<script src="<%= ResolveClientUrl("MyScriptLibrary.js") %>" type="text/javascript">
</script>

为了防止脚本文件被多次引用,我建议使用其他帖子中指定的方法: ASP.NET dynamically insert code into head

这是用户控件代码中的样子:

// Register a script reference: 
Page.ClientScript.RegisterClientScriptInclude(GetType(), "myLibraryScript", "~/Scripts/MyScriptLibrary.js"); 

【讨论】:

  • 它是一个 html 标记...所以在这种情况下,一旦我单击 html 标记 ,它就会从 js 文件中的 js 函数更新 updatePanel (submitAge)
  • 试试这个,然后: onclick="alert(SubmitAge)" 看看会发生什么。这会告诉你是否定义了 SubmitAge。
  • 试过了,哇,功能失效了,不知道为什么?这是我在用户控件中的链接标记...
  • 现在,AgeRange.js 与 AgeRange.ascx 位于同一目录中,但是容器 aspx 文件位于上面的目录中,这肯定不重要吗?
  • 我想我现在更困惑了。你能用更完整的信息更新原始帖子吗?请尽可能多地显示来自 ASPX 的代码、背后的代码、JavaScript 文件以及您拥有的任何其他内容。
【解决方案2】:

这就是我决定这样做的方式,ResolveClientURL 很重要,静态链接并不总是有效,如果您在同一页面上多次使用控件,如果检查将阻止脚本在一个页面中多次添加.. .

    If Not Page.ClientScript.IsClientScriptIncludeRegistered("AgeRangeJS") Then ' no point in registering it twice!
        ' AND its registered in the header, where it should be, not two copies in the body :)
        Page.ClientScript.RegisterClientScriptInclude("AgeRangeJS", ResolveClientUrl("AgeRange.js")) ' ResolveClientUrl("AgeRange.js")
    End If

【讨论】:

  • 顺便说一句,没有必要检查 IsClientScriptIncludeRegistered。 ASP.NET 将自动排除重复项。这种方法几乎不需要。如果您需要根据脚本是否已经注册(尽管我不知道什么时候会发生)做出一些其他决定,它真的只需要使用。
  • 啊谢谢 eilon,将删除它...只是想说,在没有 resolveclienturl 的情况下使用它对我不起作用,即使我相信原始海报建议这应该从 userControl 本身工作...(除非我弄错了,他们的意思是让它在 aspx 页面上工作)。
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 2021-11-09
  • 2015-03-07
  • 2019-08-23
  • 2013-07-19
  • 2011-02-18
  • 2011-03-24
相关资源
最近更新 更多