我正在编写一个jQuery插件,但我遇到了一个问题:
我的HTML元素
<a id="trac"></a>调用插件的JS
$('#trac').myplugin();我的插件
$.fn.myplugin = function(){
var $root;
return this.each(function(){
$root = $(this);
$root.live('click',function(){
console.log('here');
});
});
}碰巧"here“永远不会显示。但如果我用..。
$('#trac').live('click',function(){
console.log('here');
});..."here“显示。我不明白为什么会发生这种情况,因为$root和$('#trac')是完全相同的jQuery对象。
我怎么才能修复它?
谢谢!
发布于 2011-06-20 20:48:42
".live()“函数需要一个选择器,而在您的插件中却没有给它一个选择器。您构建的jQuery对象($(this))是一个有效的对象,但是没有涉及选择器字符串。
您可以直接绑定处理程序:
$root.click(function() { ... });更详细地说:你会说,"...因为$root和$('#trac')是完全一样的。“问题是,这并不是真的。当您使用选择器字符串构建jQuery对象时,该对象会保留该选择器字符串。从“$($root)”构建“this”时,没有字符串。".live()“函数的操作方式是在<body>元素上创建一个处理程序,然后测试针对该选择器出现的每个事件的目标。
发布于 2011-06-20 21:26:55
我喜欢另一个答案,因为它是对这个问题的“直接”回答,但为了展示你为其他人做的事情的一些替代方案,我认为你可以将这个插件简化为:
<div id="mystuff">hi</div>
<div id='answer'>empty</div>
$.fn.myplugin = function() {
this.live('click', function() {
$('#answer').text('here');
});
}
$('#mystuff').myplugin();如下例所示:http://jsfiddle.net/FgUEB/,因此" this“获得选择器,然后你可以附加"live click”--没有.each的复杂性--如果你这样做(当然是用固定的选择器),它会多次将事件放在元素上,如果有几次的话-这是你在例子中的.each所暗示的。
jQuery.fn.newMethod = function(){
return this.each(function(){
alert(typeof this);
});
};内部函数(在警报中)中的引用this关键字引用当前的HTML元素。因为它不是jQuery对象,所以它不能访问jQuery方法(不过,您可以将它包装在jQuery对象中,以将这些方法作为jQuery(this)返回。
jQuery.fn.newMethod = function(){
return this.each(function(){
jQuery(this).css({'background-color':'red'});//each inner element
});
};https://stackoverflow.com/questions/6411326
复制相似问题