我正在使用jqgrid,我想使用内联编辑并屏蔽该条目,以便提示用户输入hh:mm,其中hh =小时和mm =分钟。我正在使用digitalBush蒙面jquery插件。问题是,当我从initData调用它时,它会覆盖该字段中的当前数据。我注意到当您使用模式表单进行编辑时,此行为会有所不同。有没有人有这个问题的解决方案?我将从任何事件中调用掩码,我很乐意使用任何可用的插件。据我所知,jqgrid格式化程序不提供自定义掩码,以我需要的格式引导用户输入。也很高兴错误(当然还有一小段代码来支持它)。
非常感谢。
更新:我设法凑齐了一个我正在解决的问题的演示。 S-O显然删除了我想要包装它的html,以便它可以插入并按原样运行,所以你需要将它包装在一些html中才能看到它的工作原理。再次感谢您的帮助。这是代码:
<title>Mask Problem</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/redmond/jquery-ui.css" />
<link rel="stylesheet" type="text/css" href="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.2.0/css/ui.jqgrid.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.maskedinput-1.3.min.js"></script>
<script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.2.0/js/i18n/grid.locale-en.js"></script>
<script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.2.0/js/jquery.jqGrid.src.js"></script>
<script type="text/javascript">
$.jgrid.no_legacy_api = true;
$.jgrid.useJSON = true;
</script>
<script type="text/javascript">
$(function () {
var lastSel = -1;
var mydata = [
{ HoursWorked: "0:00" },
];
$.mask.definitions['5'] = '[0-5]';
$.mask.definitions['2'] = '[0-2]';
var $grid = $("#MyGrid");
$grid.jqGrid({
datatype: "local",
data: mydata,
height: 'auto',
width: 700,
colNames: ["Hours Worked"],
colModel: [
{ name: "HoursWorked", index: "HoursWorked", width: 85, editable: true, edittype: "text", editoptions: { size: 20, maxlength: 30,
dataInit: function (elem) {
$(elem).mask("29:59");
}
},
align: "center", editrules: { custom: true, custom_func: validHourEntry }
}
],
multiselect: false,
caption: "My sample grid with Mask",
rowNum: 10,
cellEdit: true,
rowList: [5, 10, 20],
pager: '#MyGridpager',
gridview: true,
beforeSelectRow: function (rowid) {
if (rowid !== lastSel) {
$(this).jqGrid('restoreRow', lastSel);
lastSel = rowid;
}
return true;
},
cellsubmit: "clientArray"
}).jqgrid("navGrid", "#MyGrid", { add: false, del: false }); ;
});
function validHourEntry(value, colname) {
var editSuccess = true;
var errorMsg = "";
if (/^([0-1][0-9]|2[0-3]:[0-5][0-9])$/.test(value)) {
return [true, ""];
} else {
return [false, "is wrong time.<br/>Please enter the time in the form <b>hh:mm</b>"];
}
}
</script>
答案 0 :(得分:7)
您没有发布任何代码,因此我尝试使用digitalBush masked jQuery plugin自行编辑小时数。这似乎很好,我收到了
在内联编辑或
在表单编辑中。
我通过以下方式实现了这一点。首先,我定义了两个掩码:一个用于输入0-2的数字,另一个掩码用于输入0-5的数字:
$.mask.definitions['2']='[0-2]';
$.mask.definitions['5']='[0-5]';
并在网格中使用以下“时间”列定义:
{name: 'time', index: 'time', width: 70, editable: true,
editoptions: {dataInit: function (elem) { $(elem).mask("29:59"); }},
editrules: {time: true}}
我添加了关于editrules: {time: true}
的时间验证,以防止输入27:20
之类的时间。增加标准时间验证显示不完美错误警告
我们可以使用自定义验证来改善结果:
{name: 'time', index: 'time', width: 70, editable: true,
editoptions: {dataInit: function (elem) { $(elem).mask("29:59"); }},
editrules: {custom: true, custom_func: function (value) {
if (/^([0-1][0-9]|2[0-3]:[0-5][0-9])$/.test(value)) {
return [true, ""];
} else {
return [false, "is wrong time.<br/>Please enter the time in the form <b>hh:mm</b>"];
}
}}}
将验证错误消息更改为以下
我确信您可以通过另一个自定义掩码插件和验证来提高可见性。无论如何,我的实验表明,人们可以在jqGrid中成功使用掩码插件。
您可以看到演示here。
更新:对不起罗恩,为了写这个,但你发布的代码是一个非常好的例子,如何不编写程序以及如何不使用jqGrid。一开始我不想写任何评论,但后来我决定向你描述代码中的错误并解释如何修改代码。
代码中的第一个问题是您使用了对象类SampleJSObject
而不是直接使用函数。从语法中如何定义构造函数和对象的方法,代码是正确的,但是......
$.mask.definitions['5'] = '[0-5]';
为例。将设置或覆盖SampleJSObject
全局设置的每个实例创建。它看起来像副作用。function SampleJSObject
,而不是在您使用它的$(document).ready
内,因此您定义了全局类$(document).ready
内部,您定义了未初始化的变量lastSel
,并尝试在另一个范围内定义的function SampleJSObject
内进行初始化。因此变量lastSel
在$(document).ready
中保持未初始化状态,但您在构造函数中设置了另一个全局变量lastSel
。minutesToHours
等方法与您的班级SampleJSObject
无关。为什么函数或calculateHoursAndMinutes
应该是该类的成员?我认为这是设计上的错误。init
仅设置jqgridParms
属性。您可以在构造函数中以相同的方式执行此操作,但在这两种情况下,我都不清楚为什么需要和方法定义如此特定的参数。 我认为您不会创建更多此类特定类的实例。为什么需要这样的类,你必须覆盖几乎任何方法来创建类的第二个实例?datatype: "local"
,但不使用gridview: true
和data
参数,该参数允许与网格一起创建数据。它可以多次提高网格性能,特别是对于行数较多的网格。在最慢的方法示例中addRowData
中loadGrid
的使用情况。此外,在rowNum: 10
将被忽略且不会进行本地分页的情况下。方法calculateTotal
可能是虚拟WeekTotal
列最慢的实现。该功能的最有效实现是WeekTotal
列3>的custom formatter用法
{ name: "WeekTotal", index: "WeekTotal", width: 55, align: "center" ,
formatter: function (cellvalue, options, rowObject) {
/* here you can access the other columns of the same row just as rowObject.SundayMinutes and return from the function the calculated
{WeekTotal {1}}
如果您需要使用具有相同属性的许多列,则可以定义列模板(请参阅here):
value as string of HTML fragment */
}}
然后将列var myTimeTemplate = {width: 85, editable: true, edittype: "text", editoptions: { size: 20, maxlength: 30, dataInit: function (elem) { $(elem).mask("29:59"); }}
的定义减少到例如
SundayMinutes