我正在修改fancybox的一个版本,以便在运行函数之前执行一些代码。 我想我可以将代码放在run函数中,但我想知道为什么我可以执行以下操作 我关注的原始行:
D.undelegate(selector, 'touchstart.fb-start click.fb-start').delegate(selector, 'touchstart.fb-start click.fb-start', run);
我想做以下事情:
D.undelegate(selector, 'touchstart.fb-start click.fb-start').delegate(selector, 'touchstart.fb-start click.fb-start', function(){ /*do something */ run(); });
不幸的是,当我尝试像这样运行run函数时,我得到一个无法加载错误。 这里有默认处理程序和函数调用之间的区别是什么?我知道它将在以前的意义上被用作回调,但这不应该是相同的吗?或者是否有一些默认参数传递到幕后运行。我试过传递这个,即运行(这个),但fancybox仍然失败。有什么想法吗?
更大的原始资料来源:
// jQuery plugin initialization
$.fn.fancybox = function (options) {
var opts = options || {},
selector = this.selector || '';
function run() {
var group = [], relType = false, relVal = $(this).data('fancybox-group');
// Check if element has 'data-fancybox-group' attribute, if not - use 'rel'
if (typeof relVal !== 'undefined') {
relType = relVal ? 'data-fancybox-group' : false;
} else if (this.rel && this.rel !== '' && this.rel !== 'nofollow') {
relVal = this.rel;
relType = 'rel';
}
if (relType) {
group = selector.length ? $(selector).filter('[' + relType + '="' + relVal + '"]') : $('[' + relType + '="' + relVal + '"]');
}
if (group.length) {
opts.index = group.index(this);
F.open(group.get(), opts);
} else {
F.open(this, opts);
}
return false;
}
if (selector) {
D.undelegate(selector, 'touchstart.fb-start click.fb-start').delegate(selector, 'touchstart.fb-start click.fb-start', run);
} else {
$(this).unbind('click.fb-start').bind('click.fb-start', run);
}
return this;
};
答案 0 :(得分:2)
试试这个:
D.undelegate(selector, 'touchstart.fb-start click.fb-start')
.delegate(selector, 'touchstart.fb-start click.fb-start',
function(){
/*do something */
run.call(this);
});
你必须确保“run”函数设置this
设置它所期望的方式。换句话说,库确保被调用的函数将this
设置为相关的东西(fancybox对象,或其他)。当您插入这样的匿名函数时,您的函数也会被调用。您需要将this
的值传递给已存在的函数。