美好的一天,
我有一个带有两个文本框的表单,并在其他页面上使用了以下代码,所以我知道这有效。
$(document).on('focusout', '.rate', function() {
var thisTextbox = $(this).val();
if (thisTextbox.length > 0) {
var number = parseFloat(thisTextbox);
if (!isNaN(number))
$(this).val(String.format("{0:#,0.00}", number));
}
});
这将格式化数字(即45 => 45.00,1324 => 1,324.00)。它使用外部String.format javascript库。对于那些感兴趣的人,我在这里找到了这个图书馆:http://www.masterdata.se/r/string_format_for_javascript/。下载链接位于左上角。
我现在将在多个地方使用此代码,并希望创建一个我可以调用的插件:
$(".rate").setDollarAmount();
我的插件看起来像:
(function($) {
$.fn.setDollarAmount = function(options) {
var classActivator = 'rate';
return this.each(function() {
if ($(this).hasClass(classActivator)) {
$(document).on('focusout', classActivator, function() {
var thisTextbox = $(this).val();
if (thisTextbox.length > 0) {
var number = parseFloat(thisTextbox);
if (!isNaN(number))
$(this).val(String.format("{0:#,0.00}", number));
}
});
}
});
};
}(jQuery));
当我加载页面时代码正在运行,因为我可以单步执行它。但是,当我从一个文本框移动到另一个文本框时,事件不会发生。
这是HTML:
<form>
<input name="one" class="financial" />
<br />
<input name="two" />
</form>
<a href="http://www.nbcnews.com">My Link</a>
<script src="js/jquery-1.9.1.min.js"></script>
<script src="js/stringformat-1.09.min.js"></script>
<script src="js/jquery.greenify.js"></script>
<script src="js/dollarAmount.js"></script>
<script>
$(function() {
$("input[name=one]").setDollarAmount();
$('div').greenify({
text: 'Hola',
color: '#FF0000'
});
});
</script>
我还需要做些什么才能让它发挥作用吗?
TIA,
COSON
答案 0 :(得分:0)
我想这是因为你的插件在一个函数中,这个封闭函数只运行一次(当你加载页面时)
而不是:
(function($) { [...] }( jQuery ));
尝试在文件开头添加:
var $ = (undefined === $) ? jQuery : $;
答案 1 :(得分:0)
根据epascarello的评论,我将插件重新设计为:
(function($) {
$.fn.setDollarAmount = function(options) {
return this.each(function() {
$(this).on('focusout', function() {
var thisTextbox = $(this).val();
if (thisTextbox.length > 0) {
var number = parseFloat(thisTextbox);
if (!isNaN(number))
$(this).val(String.format("{0:#,0.00}", number));
}
});
});
};
}( jQuery ));
生活是美好的。感谢您的评论!
答案 2 :(得分:0)
有一些问题。
rate
类。在绑定事件之前检查它们是否具有此类,并且只绑定到具有此类的元素,即使html中不存在这些元素。'.' + classActivator
如果你试试这个jsfiddle,那么这两个改变是有效的:https://jsfiddle.net/xz7ob8tj/
但即便如此,我也不会这样写。例如,您的each()
调用只是将同一事件多次绑定到同一个类。它只需要一次绑定到一个类。此外,您的hasClass
也是多余的,因为绑定到某个类的事件不会在没有该类的元素上调用。你可以在没有插件的情况下做到这一点,只需:
var classActivator = "rate";
$(document).on('focusout', "." + classActivator, function() {
var thisTextbox = $(this).val();
if (thisTextbox.length > 0) {
var number = parseFloat(thisTextbox);
if (!isNaN(number))
$(this).val(String.format("{0:#,0.00}", number));
}
});
或者使用不使用类的插件,它只是绑定到它所调用的选择中的元素:
(function($) {
$.fn.setDollarAmount = function(options) {
this.focusout(function(){
var thisTextbox = $(this).val();
if (thisTextbox.length > 0) {
var number = parseFloat(thisTextbox);
if (!isNaN(number))
$(this).val(String.format("{0:#,0.00}", number));
}
});
};
}( jQuery ));
但是对于这个imho而言,插件似乎并不是必需的。