还是在上文《修改jQuery表格插件flexigrid源码添加自定义功能(1)》提到的那个位置添加代码,我们也可以将代码加在上文提到的代码后面:
if(p.colModel[idx].handler){
$(td).click(function(){
p.colModel[idx].handler.call(this, g, i);
});
}
这里首先判断colModel的定义里是否包含鼠标单击事件处理函数handler,如果包含,则为元素(td)添加鼠标单击事件。函数的调用使用了javascript原生的call方法,第一个参数指定了handler函数的调用者,此处用this即用户点击的td元素。第二个参数是表格类对象,第三个是索引,标明被单击的单元处于整个表格的第几行。
如果不熟悉call方法,建议读者可以找点别的资料看看,这个相对来说还是比较简单的。this关键字对于初学者来说略显复杂,总的来说,一个函数内部的this指代的就是这个函数的实际调用者,而且可以认为this总是处在某个函数内部的。笔者会找个时间专门写篇文章分享一下自己的见解。
前面讲解的都是针对表格单元的自定义功能,其实对flexigrid别的方面进行修改也是很容易的,比如针对整行或整列的修改,举个具体的例子,比如说增加针对行的鼠标双击处理事件。我们只需找到表格对象g的addRowProp方法(666行左右),顾名思义,这是一个为“行”元素添加属性的方法。查看其代码,发现其实就是遍历表格的每一行,利用jquery的链式语法,分别添加鼠标单击、鼠标键按下、抬起、以及hover的函数,控制各行在选中或未被选中的状态下,样式上的一点变化。我们可以在链式调用的最后,加上一个新的函数:
$(this).click(function (e) {
var obj = (e.target ||e.srcElement);
if (obj.href || obj.type)
return true;
$(this).toggleClass('trSelected');
if (p.singleSelect)
$(this).siblings().removeClass('trSelected');
}).mousedown(function (e) {
if (e.shiftKey) {
$(this).toggleClass('trSelected');
g.multisel= true;
this.focus();
$(g.gDiv).noSelect();
}
}).mouseup(function () {
if (g.multisel) {
g.multisel= false;
$(g.gDiv).noSelect(false);
}
}).hover(function (e) {
if (g.multisel) {
$(this).toggleClass('trSelected');
}
//新增鼠标双击事件处理,并且将行元素作为参数传递给事件处理函数
},function() {}).dblclick(
function () {
if (p.onRowDblclick){
p.onRowDblclick.call(this,this);
}
}
);
在这个函数中,我们判断表格属性的定义p中(p的解释详见上文)是否存在双击事件处理函数的定义,笔者给这个属性取名叫onRowDblclick,当存在这个属性定义时,就将行元素对象作为this调用该处理函数,并且把行元素对象作为参数传递给这个处理函数。
表格的定义类似下列代码:
$('#userGrid').flexigrid({
resizable:false,
url: url,
dataType: 'json',
method:'get',
singleSelect:true,
//定义行双击事件的处理函数为rowDblclick
onRowDblclick: rowDblclick,
colModel: [ {
display: '用户名',
name: 'userName',
width: 100,
sortable: false,
align: 'center'
………………
………………
至此,相信仔细阅读的读者已经基本了解了修改flexigrid的思路,没有修改过源码的同志们,大概已经明白了,修改源码其实是一件很简单的事情。