【问题标题】:$Find returns null$Find 返回 null
【发布时间】:2013-09-09 14:34:20
【问题描述】:

我的页面上有以下 JScript

<script type="text/javascript">
    function ProcessButtonDisable() {
        var button = $find("<%=ProcessButton.ClientID %>");
        button.disabled = true;
            }
</script>

以后

<asp:Button ID="ProcessButton" Text="Process All" runat="server" OnClick="Process_Click" OnClientClick="ProcessButtonDisable()" />

当运行页面并触发我得到的按钮时

Microsoft JScript 运行时错误:无法设置属性“已禁用”的值:对象为空或未定义

并且动态页面已将其转换为:

<script type="text/javascript">
    function ProcessButtonDisable() {
        var button = $find("ctl00_ctl00_BodyContentPlaceHolder_MainContentPlaceHolder_ProcessButton");
        button.disabled = true;
    }
</script>

<input type="submit" name="ctl00$ctl00$BodyContentPlaceHolder$MainContentPlaceHolder$ProcessButton" value="Process All" onclick="ProcessButtonDisable();" id="ctl00_ctl00_BodyContentPlaceHolder_MainContentPlaceHolder_ProcessButton" />

由于控件已明确定义,并且客户端 ID 似乎返回了正确的 ID,我不知道出了什么问题

有什么帮助吗?

ps 如果从代码中不清楚,这样做的目的是防止用户在初始点击后有时间重新加载页面之前点击并重新发送请求

【问题讨论】:

  • 试试$.find()(注意点)或$(document).find()
  • 现在按钮的值为 [],虽然它没有出错但也不会禁用按钮
  • 另外,find 返回一个数组....$.find()[0] 会给你按钮
  • 无论如何我的回答应该对你有帮助:)
  • $.find 是空数组 $(document).find() 有数据

标签: asp.net .net jscript.net


【解决方案1】:

-1 对假设 JQuery 的所有先前答案。 $find is a function 由 Microsoft AJAX 库定义。它“提供了 Sys.Application 类的 findComponent 方法的快捷方式”,该方法获取“对已通过 addComponent 方法注册到应用程序的 Component 对象的引用”。尝试改用 $get(),它“提供了 Sys.UI.DomElement 类的 getElementById 方法的快捷方式。”

此页面详细探讨了这两个功能:The Ever-Useful $get and $find ASP.NET AJAX Shortcut Functions

【讨论】:

  • 对其他所有人的答案投反对票似乎有点小气,因为他们掩盖了一点复杂性。否决票适用于所提供的答案完全无用和错误的情况,因此您的答案主要是抱怨不正确的术语,几乎没有努力回答原始问题,您的问题与您投反对票的所有答案一样值得投反对票,所以我可以理解他们是否是报复性的
  • @MikeT 这一点都不小气。这是向下投票功能的目的。他们正在回答一个假设的问题,而不是被问到的问题。术语与它无关。 $Find 来自一个完全不相关的 javascript 库; MS AJAX JS 库,而不是 JQuery。我的答案有 1 个简短的句子描述了我的反对票以及为什么其他答案是错误的(占我答案的 10%,而不是“大多数”)。显然这太很少,如果有的话,因为你显然没有花时间去理解问题或答案。
  • 这里是正确的链接:gsravisankar.blogspot.co.za/2010/12/…
【解决方案2】:

$find$.find 不同。第一个是为Microsoft AJAX 库定义的Sys.Application 类的findComponent 方法提供一个快捷方式。而第二个是来自 jQuery 的 API 方法,它获取当前匹配元素集中每个元素的后代,由选择器、jQuery 对象或元素过滤。

所以,$find 必须找到 Component 而不是 html DOM。并且必须定义 ajax 库。

更多信息:

http://msdn.microsoft.com/en-us/library/vstudio/bb397441(v=vs.100).aspx

http://api.jquery.com/find/

【讨论】:

  • 清晰在编程中很重要,你的意思是写$Find还是$find
【解决方案3】:

试试这个:

<script type="text/javascript">
    function ProcessButtonDisable() {
        var button = $("#<%=ProcessButton.ClientID %>");
        button.disabled = true;
    }
</script>

[编辑] 或

<script type="text/javascript">
    function ProcessButtonDisable() {
        $("#<%=ProcessButton.ClientID %>").attr("disabled", "disabled");
    }
</script>

【讨论】:

  • 返回 Microsoft JScript 运行时错误:无法获取属性 'attr' 的值:对象为 null 或未定义
【解决方案4】:

您必须首先选择您要“找到”的内容。例如,如果您选择文档,然后使用“查找”方法,您应该会得到您想要的结果。

<script type="text/javascript">
    function ProcessButtonDisable() {
        var button = $(document).find(("<%=ProcessButton.ClientID %>");
        button.disabled = true;
        }
</script>

【讨论】:

    【解决方案5】:

    disabled 不是 jQuery 对象属性,它是 DOM 元素属性。 尝试使用:

    $('selector').get(0).disabled = true
    

    ,或

    $('selector').attr('disabled','disabled');
    

    【讨论】:

    • 不太相关,好像对象为空你也不能改变 attr
    • NRE 来自于尝试从无效的隐式参数(在这种情况下为 null)访问属性。但正如您从@[Karl Anderson] 的回答中发现的那样,您试图从$find shortcut call 产生的Microsoft AJAX 库组件对象访问DOM 属性。 Karl 的前两个答案仍然对您不起作用,因为他也试图从非 DOM (jQuery) 对象访问 DOM 属性。
    【解决方案6】:

    你需要使用点符号,因为find()是一个jQuery函数,像这样:

    <script type="text/javascript">
        function ProcessButtonDisable() {
            var button = $.find("<%=ProcessButton.ClientID %>");
            button.disabled = true;
        }
    </script>
    

    另外,如果您打算在 jQuery 逻辑中查找 DOM 元素,请不要费心在服务器控件上连接 OnClientClick;要么通过 jQuery 连接 click 事件,要么将元素本身传递给 JavaScript 函数:

    使用jQuery连接点击事件(推荐):

    <script type="text/javascript">
        $(document).ready(function() {
             $("#<%=ProcessButton.ClientID%>").click(function() {
                $(this).disabled = true;
             });
        });
    </script>
    

    使用OnClientClick 属性连接点击事件并传递元素(不推荐):

    <asp:Button ID="ProcessButton" Text="Process All" runat="server" OnClick="Process_Click" 
        OnClientClick="ProcessButtonDisable(this)" />
    
    <script type="text/javascript">
        function ProcessButtonDisable(elem) {
            elem.disabled = true;
        }
    </script>
    

    【讨论】:

    • 不建议这样做,因为它不必要地将 JavaScript 耦合到标记本身中的 DOM 元素。这会使标记变得混乱,尤其是当您有多个按钮由相同的事件处理程序代码处理时。而使用不显眼的 JavaScript,您可以创建一个选择器,将相同的单击处理程序应用于具有相同特征的几个不同按钮(即作为按钮,或具有相同的 class 属性)。这使得 JavaScript 逻辑与实际标记分离,您不需要在多个按钮标签中调用相同的函数。
    • 不建议这样做,但不要认为这意味着你不能这样做,因为它会起作用。将 JavaScript 和 HTML 元素彼此分开定义是一个很大的推动力,但它带来了在调试代码或更糟地调试其他人的代码时必须独立查看两个文件或文件部分的不便。我可能不应该将recommendedenot recommended cmets 放在我的答案中。我很抱歉,但很高兴它对你有用。 :-)
    • 不用担心,就像老手看到新手和专家之间的区别一样,新手不知道规则,专家知道何时忽略它们。我是新手 Web 开发人员,所以我需要了解规则及其原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 2011-05-04
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多