asp.net.netjscript.net

$Find returns null


I have the following JScript on a page

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

and later

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

when running the page and firing off the button i get

Microsoft JScript runtime error: Unable to set value of the property 'disabled': object is null or undefined

and the dynamic page has converted it to:

<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" />

as the control is clearly defined and the client id seems to be returning the correct id i don't know whats wrong

Any help?

ps in case this is not clear from the code the purpose of this is to prevent he user from clicking on the and resending the request before the page has time to reload after the initial click


Solution

  • You need to use the dot notation, as find() is a jQuery function, like this:

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

    Also, if you are going to take the trouble to look up the DOM element in your jQuery logic, then do not bother wiring up the OnClientClick on the server control; either wire up the click event via jQuery or pass the element itself to the JavaScript function:

    Using jQuery to wire up the click event (recommended):

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

    Using the OnClientClick attribute to wire up the click event and pass the element (not recommended):

    <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>