的jQuery在选择上的所有元素扩展方法
我想添加一个方法到一组元素的使用延长从选择返回:的jQuery在选择上的所有元素扩展方法
$(document).ready(function() {
$.extend($('.panel[data-refresh-url!=""][data-refresh-url]'), {
refresh: function (successFunc) {
// --- --- --- --- --- --- --- --- --- --- --- --- --- ---
var refreshElement = $(this).data('refresh-element');
if (refreshElement == undefined) { refreshElement = $(this).find('.panel-body'); }
refreshElement.empty().append('<div class="spinner"><i class="fa fa-2x fa-spin fa-spinner"></i></div>');
$.ajax({
url: $(this).data('refresh-url'),
type: 'post',
data: null,
success: function (data) {
if (successFunc == undefined) {
refreshElement.empty().append(data);
} else {
refreshElement.empty().append(successFunc(data));
}
},
error: function (xhr, status, error) {
refreshElement.empty().append('<i class="fa fa-exclamation-triangle"></i> Could not reload panel..');
}
});
// --- --- --- --- --- --- --- --- --- --- --- --- --- ---
}
});
});
(更新:我加满的方法,只是如果是以某种方式导致问题)。
我试过$.extend
和$.fn.extend
,但每当我尝试拨打$('#element').refresh()
,我得到refresh is not a function
。
我已经改变了方法,改为使用bind('refresh')
而不是所有的工作,但我需要传递一个函数,在成功刷新时执行,我的印象我不能那样做。
我真的不太熟悉jQuery - 我错过了什么?
我认为你完全错用了$.extend
。 $.extend
用于将两个对象合并在一起,显然可以用于扩展带辅助对象的一个主对象,如使用大括号和单个属性refresh
创建的对象。
现在,在这种情况下,您正试图扩展返回值的$('.panel[data-refresh-url!=""][data-refresh-url]')
,这是暂时的。即使你有它的一个变量,像这样:
var $buttons = $('.panel[data-refresh-url!=""][data-refresh-url]');
$.extend($buttons, { /...
这将只需添加一个方法refresh
到$buttons
对象,而不是匹配元素本身。
在另一方面,如果你使用$.fn.extend
,你就可以有效地创建一个jQuery插件,这将增加一个方法refresh
由$
返回的每一个对象,这不是你想要什么,我猜。
$(document).ready(function() {
var $buttons = $('.panel[data-refresh-url!=""][data-refresh-url]');
for (var i = 0; i < $buttons.length; ++i)
{
$.extend($buttons[i], {
refresh: function (successFunc)
{
alert("Hey, I'm a button");
}
});
}
// TESTING
$('.panel[data-refresh-url!=""][data-refresh-url]')[0].refresh();
});
你想要做的是坚持refresh
方法到(特定的)一套HTMLParagraphElement
。要做到这一点香草JS,你会做这样的事情:
HTMLParagraphElement.prototype.refresh = function(){
alert('f');
}
$('p').click(function(){
this.refresh();
});
注意你怎么称呼this.refresh()
,而不是$(this).refresh()
。
jQuery的一个主要原因是它封装了自己内部的任何新方法 - 它不扩展现有的DOM对象。因此,$.extend
不会按照您希望的方式工作。
我(认为)发生了什么事情是你通过执行$(selector)来获取对包装在jQuery对象中的元素的引用。然后你在扩展那个对象,但实际上并没有向底层对象添加任何东西。 This fiddle显示您在该范围内$ .extend'对象,但是当您调用该方法时(例如绑定click
处理程序时),您将失去任何更改。
有几种不同的方式来实现你想要做的事情。最简单的方法是使用$.data来存储该函数,并通过该函数调用它。 Here's a fiddle of that。
如果您确实想要扩展HTMLParagraphElement,您可以通过在prototype
对象上调用$.extend
来完成。 This blog post详细解释它,但你基本上只是做下面的事情。
$.extend(HTMLParagraphElement.prototype, {
refresh: function() {
alert('Refresh called!');
}
});
$('.panel').find('[data-refresh-url!=""][data-refresh-url]').click(function(){
this.refresh();
});
我个人认为,你不应该修改,你不拥有的对象 - 所以我想与$.data
方法去。另外,jQuery UI使用了一个很好的模式,在this post on Stack中简要解释。
'$ .data'方法看起来很有趣 - 我尝试过'bind',但在获取数据时遇到了一些困难。我会定期尝试一下,谢谢。 – Octopoid
如果你只是想以一个新的方法添加到jQuery的对象,你有没有尝试过:
在这一天结束时,你可以手动的方法使用一个循环添加到每个匹配的元素只需使用$.fn.methodName=function(){}
?
$.fn.newMethod=function(){
console.log(this); // jQuery object
}
$('#element').newMethod();
我原本打算只将它添加到特定选择对象下tor - 仅仅是因为它可以捕获主要的其他面板数据属性和元素。我想我可以仅仅在函数内部做这些检查。 – Octopoid
嗯,这就是说没有这样做的例子在线..最后一部分实际上听起来像我想要做的事情 - 我有很多面板,我想添加此功能。编辑:噢,我试图将它添加到项目集合的问题也是如此,但是如果我逐项执行它,那么还可以吗? – Octopoid
不,如果你使用扩展的单个对象,问题是相同的。仔细看,我正在使用'$ buttons [i]'。当我像数组一样索引由'$'返回的对象时,它将返回该页面中的实际元素。这就是你想要扩展的对象,就像我的例子。 –
考虑一下:如果你使用'$(#foo)'并且使用它,那就是jQuery对象。如果使用'$(#foo)[0]',那就是实际的HTML元素。 –