开发者

Events not firing in jQuery plugin

I 开发者_开发百科have a textfield with drop down suggestion box. I created a plugin for the textfield to display search suggestions. But the keyup and blur events are not firing.

    (function($){
    $.fn.suggestions = function(input, suggestbox, options){
        alert("page loaded");
        alert(this.css("visibility"));
        this.keyup(function(event){
                alert(this.val());
                if(this.val() != ""){
                    $(suggestbox).css("visibility", "visible");
                    alert($(suggestbox).css("visibility"));
                    $(suggestbox).hide();
                    $(suggestbox).fadeIn("fast");
                    var query = this.val();
                    $(suggestbox).empty();
                    $(suggestbox).append("<ul>").css({
                                'list-style-type': 'none',
                                'cursor': 'pointer'
                            });
                    input(query, function(companies){
                        $.each(companies, function(index, value){
                            $(suggestbox).append("<li>" + value + "</li>").children("li").mouseover(function(event){
                                $(this).removeClass(options.mouseoutcss);
                                $(this).addClass(options.mouseincss);
                            }).mouseout(function(){
                                $(this).removeClass(options.mouseincss);
                                $(this).addClass(options.mouseoutcss);
                            }).click(function(){
                                        this.val($(this).text());
                                        $(suggestbox).hide();
                                    });
                        });
                    });
                    $(suggestbox).append("</ul>");
                }else{
                    $(suggestbox).fadeOut("fast", function(){
                        $(suggestbox).css("visibility", "hidden");
                    });
                }
            });

            this.blur(function(){
                setTimeout(function(){
                    if($(suggestbox).css("visibility") == "visible"){
                        $(suggestbox).hide();
                    }
                }, 200);
            });

    };

}) (jQuery);

I've also tried the following but no luck either.

        this.each(function(){
    $(this).keyup(function(event){....});
});


Cause

this.val is not a function in your keyup handler. this would refer to the html element, not a jQuery object. Your handler is being triggered, but it is throwing an error right at the start.

Solution

Ensure that you are using a jQuery object where appropriate in your handlers. For example, change this.val to $(this).val. I have created a jsFiddle demonstrating some of the required fixes. It will not completely work, as the code you gave was incomplete, but it should show you some of the corrections that are required.

Notes

  • this, in the scope of the jQuery plugin, is a jQuery object.
  • this, in the scope of an event handler, is an HTML element object.
  • To get a jQuery object for a given HTML element object, do $(myHtmlElem), where myHtmlElem is an HTML element object.


alert(this.val()) is an error (this is a DOM element inside the event handler), which breaks the execution of the event handler.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜