$(文件).ready似乎开火但没有注册活动

时间:2011-01-28 00:44:15

标签: javascript jquery javascript-events

加载时会触发两个事件,但不会使用指定的事件处理程序注册。不行为的代码是:

            $("#calendar_menu_item").bind('click', loadCalendarContent() );
            $("#patient_menu_item").bind('click', loadPatientContent() );   

这是整个剧本:

    /* Add stuff only once the DOM is loaded. */
    $(document).ready
        (
        function(){ 
            //Initialize the main menu  
            var menuItems = [$("#calendar_menu_item"), $("#patient_menu_item")];

            for (i = 0; i < menuItems.length; i++) {
                var menuItem = menuItems[i];

                menuItem.bind('mouseover', function(){
                    $(this).css("background-color", "#749ccf");
                });

                menuItem.bind('mouseout', function(){
                    $(this).css("background-color", "#506077");                     
                });
            }       

            $("#calendar_menu_item").bind('click', loadCalendarContent() );
            $("#patient_menu_item").bind('click', loadPatientContent() );               
        }
        );  

    function loadCalendarContent(){
        $("#content_area").load('calendar.html');           
    }

    function loadPatientContent(){
        $("#content_area").load('patient.html');            
    }       

    function doAction(){
        alert( "in doScript()");
    }

3 个答案:

答案 0 :(得分:2)

您需要更改:

        $("#calendar_menu_item").bind('click', loadCalendarContent() );
        $("#patient_menu_item").bind('click', loadPatientContent() ); 

应该是:

        $("#calendar_menu_item").bind('click', loadCalendarContent );
        $("#patient_menu_item").bind('click', loadPatientContent ); 

这是因为loadCalendarContent(和loadPatientContent)也没有返回任何内容,所以loadPatientContent()是未定义的。换句话说,您每次点击undefined时都会尝试运行#calendar_menu_item。如果您希望在domready上执行这些功能(document.ready),您可以使用以下代码执行此操作:

        loadCalendarContent();
        loadPatientContent();
        $("#calendar_menu_item").bind('click', loadCalendarContent );
        $("#patient_menu_item").bind('click', loadPatientContent ); 

答案 1 :(得分:2)

你不太了解函数作为一等对象。当你看到这个:

foo()

正在调用一个名为foo的函数。当你看到这个:

foo

这是一个变量。变量可以包含函数。

您的代码是这样的:

$(element).bind('click', foo() );

当您在()之后看到foo时,表示它正在调用该函数并用其返回值替换对它的引用。这不是你想要的。你想要的是简单地将函数作为变量传递。这看起来像这样:

$(element).bind('click', foo);

这样,回调是通过对函数的引用来注册的,并且可以在必要时调用该函数,而不是直接调用。

具体来说,您的代码应如下所示:

$("#calendar_menu_item").bind('click', loadCalendarContent);
$("#patient_menu_item").bind('click', loadPatientContent);

答案 2 :(得分:0)

loadCalendarContent是对函数的引用,但是loadCalendarContent()执行函数,所以改变它:

$("#calendar_menu_item").bind('click', loadCalendarContent() );

$("#calendar_menu_item").bind('click', loadCalendarContent);