【发布时间】:2014-06-09 15:22:54
【问题描述】:
我正在调用一些 jQuery 插件,它们将自己附加到 DOM 上的元素准备就绪。当某些事件发生(点击、更改等)时,这些插件会操纵 DOM
$("body").find("input[type='checkbox']").checkbox();
以上在 DOM 就绪时工作正常。但是,如果我从 AJAX 调用加载一些 HTML,我必须使用 .on() 来保证事件得到一致的绑定。
问题是我应该将插件绑定到哪个事件?我在下面尝试过,它似乎没有响应。
$("body").on("load", "input[type='checkbox']", function(){
$(this).checkbox();
});
这是我上面提到的 checkbox() 插件。如果这有任何帮助。 :)
'use strict';
define(['jquery'], function($){
return function(){
$.fn.checkbox = function (options) {
options = options || {};
var defaults = {
'className': 'jquery-checkbox',
'checkedClass': 'jquery-checkbox-on'
};
var settings = jQuery.extend(defaults, options);
return this.each(function () {
var self = jQuery(this);
var replacement = jQuery(
'<span class="' + settings.className + '-wrapper">' +
'<a class="' + settings.className + '" href="#" name="' + self.attr('id') + '"></a>' +
'</span>');
var element = jQuery('a', replacement);
if (self.prop('checked')) {
element.addClass(settings.checkedClass);
}
element.on('click', function (event) {
event.preventDefault();
event.stopPropagation();
var input = jQuery('input#' + jQuery(this).attr('name'), replacement.parent());
if (input.prop('checked')) {
input.removeAttr('checked');
} else {
input.prop('checked', true);
}
input.trigger('change');
return false;
});
element.on('focusin', function (event) {
$(this).addClass('checkbox-focus');
});
element.on('focusout', function (event) {
$(this).removeClass('checkbox-focus');
});
element.on("keypress", function(e){
if ( e.which === 32 ){ self.prop('checked', !self.prop('checked')).change(); }
});
self.on('change', function (event) {
var input = jQuery(this);
if (input.prop('checked')) {
jQuery('a[name=' + input.attr('id') + ']', replacement.parent()).addClass(settings.checkedClass);
} else {
jQuery('a[name=' + input.attr('id') + ']', replacement.parent()).removeClass(settings.checkedClass);
}
return true;
});
self.css({
'position': 'absolute',
'top': '-200px',
'left': '-10000px'
}).before(replacement);
});
}
};
});
【问题讨论】:
-
你有没有尝试过你真正想要的事件,比如
click等等 -
您是否尝试绑定到由 Ajax 加载的元素?如果是这样,请将
document用于on绑定,而不要使用body(body似乎有一些“怪癖”),并从“点击”之类的控件中指定您想要的实际事件:) -
插件实际上是监听事件而不是触发事件。如果这有意义的话!
-
那你想做什么?触发特殊事件还是什么?如果您只想在加载元素后附加插件,您可以在 ajax 调用的回调中执行此操作?
-
@adeneo 抱歉含糊不清。我已经添加了上面的插件代码。是的,我知道我可以在回调中调用插件试图避免这种情况,因为如果我有多个地方需要加载上述插件,我将需要始终在所有回调中调用插件。谢谢
标签: javascript jquery ajax