0

jqGrid一起使用Backbone.js并且我有代表网格的视图。代码如下:

var GridView = Backbone.View.extend({
    initialize:     function(){
        _.bindAll(this);
    },
    beforeSelectRow:function(e){
        return $(e.target).is('img') ? false : true;
    },
    render:         function(){
        var self = this;

        this.$el.load(
            this.collection.url + 'grid/',
            function(){
                self.$jqGrid = self.$('.jqGrid');
                self.$jqGrid.on('jqGridBeforeSelectRow',self.beforeSelectRow);
            }
        );

        return this;
    }
});

网格的行可以包含图像。如果我单击某个图像,我会期望网格的行不会被选中。我监听了触发的事件jqGridBeforeSelectRowjqGrid但我得到了一个不正确的事件目标。我希望事件目标是图像。我发现了类似的问题JQGrid Not select row when click in a specific cell and there are all works。我的听众怎么了?

谢谢!

4

2 回答 2

2

首先,请更改:

return $(e.target).is('img') ? false : true;

到:

return !$(e.target).is('img');

其次,您应该看一下jqGrid 的文档,它说侦听器采用的参数是 (rowid, e)。所以基本上你使用的e参数是 rowid,没有任何目标键。

第三,还请查看Backbone 的文档,如果您的版本足够新(或者如果您可以更新),请考虑删除_.bindAll(this)并改用 Model#listenTo 方法,如self.listenTo(self.$jqGrid, self.beforeSelectRow).

最后但同样重要的是,您确定 beforeSelectRow 事件是由您的 $jqGrid 元素触发的吗?可能不是这样。但这只是在进行这些更改后验证它是否不起作用。

于 2013-04-05T13:24:00.457 回答
1

我自己不使用 Backbone,但我希望我理解你是正确的。如果单击的是网格内部的图像,您想拒绝选择网格的行。回调beforeSelectRow是事件的事件处理程序jqGridBeforeSelectRow。如果我理解你是正确的,那么同一个事件处理程序可以通过以下方式绑定

$("#list").bind("jqGridBeforeSelectRow", function (e) {
    return $(e.target).is('img') ? false : true;
});

事件处理程序是错误的,因为e.target它始终<table>是元素的 DOM,它是网格的基本元素。原因是元素jqGridBeforeSelectRow的自定义事件<table>

正确的实施将是

$("#list").bind("jqGridBeforeSelectRow", function (e, rowid, eventOriginal) {
    return !$(eventOriginal.target).is("img");
});

发起“jqGridBeforeSelectRow”事件eventOriginal的原始事件的表示事件对象。click我认为将更改转换为 Backbone 版本对您来说很清楚。

演示演示了结果。

于 2013-04-05T14:11:50.040 回答