jQuery插件中未触发的事件
我有一个带有下拉建议框的文本字段。我为textfield创建了一个插件来显示搜索建议。但是keyup和blur事件没有触发jQuery插件中未触发的事件,jquery,jquery-plugins,Jquery,Jquery Plugins,我有一个带有下拉建议框的文本字段。我为textfield创建了一个插件来显示搜索建议。但是keyup和blur事件没有触发 (function($){ $.fn.suggestions = function(input, suggestbox, options){ alert("page loaded"); alert(this.css("visibility")); this.keyup(function(event){
(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);
原因
this.val不是keyup处理程序中的函数。这将引用html元素,而不是jQuery对象。您的处理程序正在被触发,但它在一开始就抛出了一个错误
解决方案
确保在适当的处理程序中使用jQuery对象。例如,将this.val更改为$this.val。我已经创建并演示了一些必需的修复。它不会完全起作用,因为您提供的代码不完整,但它应该向您显示一些所需的更正
笔记
在jQuery插件的范围内,这是一个jQuery对象。
在事件处理程序的范围内,这是一个HTML元素对象。
要获取给定HTML元素对象的jQuery对象,请执行$myHtmlElem,其中myHtmlElem是一个HTML元素对象。
alertthis.val是一个错误这是事件处理程序中的一个DOM元素,它会中断事件处理程序的执行。查看javascript控制台,是否存在任何错误?是的,它在this.val上出现了问题,我认为这是一个jQuery对象。伙计,你太棒了!非常有魅力,感谢您为将其放入JSFIDLE而付出的额外努力!!谢谢你的回答。你也是对的,但我按照Spycho的回答做了,而且做对了。再次感谢!!:O
this.each(function(){
$(this).keyup(function(event){....});
});