【问题标题】:javascript element not found未找到 javascript 元素
【发布时间】:2012-08-29 16:31:16
【问题描述】:

我的应用中有一个“导出到 excel”选项。当我单击该按钮时,我正在向用户显示一条确认消息。当用户单击确定时,我正在使用 JavaScript 调用单击事件。

<asp:Content ID="Content3" ContentPlaceHolderID="PagePlaceholder" runat="Server">
<asp:ScriptManager ID="smMainpage" runat="server">
</asp:ScriptManager>
<table style="width: 100%">
    <tr>
        <td colspan="2">
            <asp:UpdatePanel runat="server" ID="up">
                <ContentTemplate>
                    <div style="text-align: left; font-size: 8pt" id="div5" runat="server">
                        <table width="100%" cellpadding="0" cellspacing="0">
                            <tr>
                                <td align="right" style="width: 50%">
                                    <table>
                                        <tr>
                                            <td style="display: none">
                                                <asp:Button ID="btnblkupdate" runat="server" Text="None" OnClick="btnblkupdate_click" />
                                                <div>
                                                    <asp:Button ID="btnhdnExport" runat="server" OnClick="btnhdnExport_click" /></div>
                                            </td>
                                            <td>
                                                &nbsp;
                                                <asp:LinkButton ID="lnkExport" OnClick="lnkExport_Click" CssClass="customFont" runat="server"
                                                    Text="Export to Excel"></asp:LinkButton>
                                                &nbsp;
                                            </td>
                                            <td>
                                                &nbsp;
                                                <asp:LinkButton ID="lnkbtnFilter" OnClick="lnkbtnFilter_Click" CssClass="customFont"
                                                    runat="server" Text="Filter Data"></asp:LinkButton>
                                                &nbsp;
                                            </td>
                                            <td>
                                                <asp:LinkButton ID="lnkReset" OnClick="lnkReset_Click" Visible="false" CssClass="customFont"
                                                    runat="server" Text="Reset Filter"></asp:LinkButton>
                                                &nbsp;
                                            </td>
                                            <td>
                                                <asp:LinkButton ID="lnkbtnViewAll" OnClick="lnkbtnViewAll_Click" runat="server" Text="View All"></asp:LinkButton>
                                                &nbsp; Selected Records:<asp:Label ID="lblselTsks" Width="20px" Font-Size="10pt"
                                                    Font-Bold="true" runat="server" Text="0"></asp:Label>
                                                &nbsp;
                                            </td>
                                            <td>
                                                Total Records found:&nbsp;<asp:Label ID="lblTotRecCount" Font-Bold="true" runat="server"
                                                    ForeColor="Black" Font-Size="10pt" Text="0"></asp:Label>
                                            </td>
                                        </tr>
                                    </table>
                                </td>
                            </tr>
                        </table>
                    </div>
                </ContentTemplate>
                <Triggers>
                    <asp:PostBackTrigger ControlID="lnkExport" />
                    <asp:PostBackTrigger ControlID="btnhdnExport" />
                </Triggers>
            </asp:UpdatePanel>
            <asp:UpdateProgress ID="UpdateProgress5" EnableViewState="false" AssociatedUpdatePanelID="up"
                DisplayAfter="10" runat="server">
                <ProgressTemplate>
                </ProgressTemplate>
            </asp:UpdateProgress>
        </td>
    </tr>
</table>

protected void lnkExport_Click(object sender, EventArgs e)
{
    DataSet dsResult = new DataSet();
    try
    {
        string strName = string.Empty;
        clsSearch_BL clsObj = new clsSearch_BL();
        //dsResult = (DataSet)Session["SearchRes"];

        if (Session["detObj"] != null)
        {
            DetState detObj = (DetState)Session["detObj"];
            dsResult = clsObj.getSearchResults_BL(detObj);
            HashSet<string> orderIdclmtest = new HashSet<string>();
            int j = dsResult.Tables[0].Rows.Count;
            for (int k = 0; k < j; k++)
            {
               orderIdclmtest.Add( dsResult.Tables[0].Rows[k][1].ToString());
            }
             Session["orderIdclmtest"] = orderIdclmtest.ToString();

            HashSet<string> strtest = new HashSet<string>();
            strtest =(HashSet<string>)Session["orderIdclm"];

            var testttt=strtest.Except(orderIdclmtest).ToList();
            int cnt = testttt.Count;
            StringBuilder str = new StringBuilder();
            for (int i = 0; i < cnt; i++)
            {
                if (str.Length == 0)
                    str.Append(testttt[i]);
                else
                    str.Append(", " + testttt[i]);
            }
            ScriptManager.RegisterClientScriptBlock(this.up, this.GetType(), "export", "hdnExportExcel()", true);
            //if (testttt != null && testttt.Any())
            //{
            //    ScriptManager.RegisterClientScriptBlock(this.up, this.GetType(), "export", "hdnExportExcel('"+str+"')", true);
            //}
        }
    }
    catch (Exception ex)
    {
        log4net.Config.XmlConfigurator.Configure();
        log.Warn("Logging:" + ex);

    }
    finally {
        if(dsResult != null)
        dsResult.Dispose();
    }
}

function hdnExportExcel() {
if (confirm('You are about to miss the tasks do you want to continue?')) {
    document.getElementById('ctl00_PagePlaceholder_btnhdnExport').click();
}
else {
    return false;
}}

我的问题是document.getElementById('ctl00_PagePlaceholder_btnhdnExport') 为空。但在页面的源代码中,我可以看到元素 ID 为 ctl00_PagePlaceholder_btnhdnExport

我不知道为什么它不起作用。我猜这是因为更新面板中的回发触发器。我尝试将btnhdnExport 放在更新面板之外并将其从触发器选项中删除。但它没有用。有什么建议吗?

提前致谢

【问题讨论】:

  • 你能发布html吗?我在 asp 代码中的任何地方都看不到ctl00_PagePlaceholder_btnhdnExport
  • 这里有很多问题。为什么包含 &lt;td&gt; 隐藏?另一个回发触发器(“lnkExport”)在哪里?最重要的是,从哪里调用 hdnExportExcel?我希望它被分配给 btnhdnExport.OnClientClick。您是否在 AsyncPostback 期间注册它?
  • @chprpipr,我的要求是当用户单击导出到 excel 时,我需要将该网格上的订单与另一个列表或订单进行比较。如果缺少任何订单,我需要在上面显示消息。如果用户单击是,则导出否则不要。所以我做了一个隐藏按钮,如果用户点击是然后使用javascript调用隐藏按钮点击事件..我没有发布整个代码。 lnkExport 也在更新面板中请查看修改后的代码

标签: javascript .net ajax


【解决方案1】:

正如 Ankur 所说,在加载 JavaScript 时(页面正在动态创建),您的元素 ID 无法访问。

我会建议改变

document.getElementById('ctl00_PagePlaceholder_btnhdnExport')

document.getElementById('btnhdnExport')

【讨论】:

    【解决方案2】:

    当 UpdatePanel 更新时,它会替换其容器 &lt;div&gt; 中的所有内容。在调用您的 JS 代码时,该按钮实际上并不存在。解决此问题的一种方法是在 UpdatePanel 完成后使用 .NET 的 PageRequestManager 调用您的 JS 代码。试试这样的:

    function hdnExportExcel() {
    
      var prm = Sys.WebForms.PageRequestManager.getInstance();
      prm.add_pageLoaded(function() {
    
          if (confirm('You are about to miss the tasks do you want to continue?')) {
              document.getElementById('<%= btnhdnExport.ClientID %>').click();
          }
          else {
              return false;
          }
      }
    
    }
    

    您会注意到我也没有对按钮的 ID 值进行硬编码。您需要避免对 .NET 动态生成的任何 id 值进行硬编码,因为它们会在您的页面结构将来发生变化时发生变化。在页面的其他地方进行不相关的更改并在测试或以后发现以前可靠的功能现在被破坏了,这可不是一件有趣的事。

    【讨论】:

    • 确保您的 javascript 块位于您的 aspx 页面上的 ScriptManager 下方。
    • 现在我收到类似 ReferenceError: hdnExportExcel is not defined 的错误
    • 用这个替换你现有的代码:ScriptManager.RegisterClientScriptBlock(this.up, this.GetType(), "export", "setTimeout(function() { hdnExportExcel(); }, 0)", true);
    • 如果我放置此代码会发生什么?为什么我之前得到 hdnExportExcel 未定义错误?我只是想知道。
    • 产生了“hdnExportExcel 未定义”错误,因为在执行“RegisterClientScriptBlock”代码时,尚未定义 hdnExportExcel 函数(它在几行之后定义)。通过添加 setTimeout 方法,hdnExportExcel 被“延迟”或稍后运行。这应该会导致它在定义 hdfExportExcel 后运行,从而消除错误。
    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多