jqgrid ie8多个搜索过滤器在使用cmTemplate时不选择搜索数据

时间:2012-09-07 05:53:20

标签: jquery search jqgrid

使用ie8,jqgrid 4.3.3,jquery 1.7.2或1.5.2,多次搜索似乎错过了一些搜索参数。 在第一次添加新搜索行时,它出现在请求正文中,但带有空值(“”) 如。

"filters":"{\"groupOp\":\"AND\",\"rules\":[{\"field\":\"code\",\"op\":\"eq\",\"data\":\"\"}]}", 

使用相同参数的后续搜索会发送正确的值。 我的基本设置如下(简化)

$('#Table').jqGrid({
         //....
    datatype: 'json',
    colNames: ['Code'],
    colModel: [{
        name: 'Code',
        index: 'Code'}],
    pager: '#Pager'
}).jqGrid('navGrid', '#Pager', {
    add: false,
    edit: false,
    del: false,
    refresh: false
}, {}, {}, {}, {
    multipleSearch: true
}).trigger('reloadGrid');

更新已添加jsfiddle

经过很长一段时间后,我发现只有当我使用cmTemplate指定searchoptions sopt时才会发生错误,当我点击'find'而没有首先点击数据文本框外。 See jsfiddle here(记得在输入搜索值后直接点击查找按钮)

1 个答案:

答案 0 :(得分:1)

我想,这是一个旧的错误,刷新了jqGrid输入字段,我将其描述为here。您可以尝试插入以下回调

afterRedraw: function () {
    $(this).find(".input-elm").triggerHandler('change', [true]);
}

喜欢here。您也可以尝试使用jqGrid 4.4.1而不是4.3.3。该版本应该没有这样的问题。

更新:我发现我之前发布和提交的更改已恢复:请参阅here。我的建议是收集了许多改进:

  1. 搜索对话框中的按钮样式用于jQuery UI和jqGrid的所有其他部分。可以使用uiButtons: false来使用旧样式。
  2. 可以更改默认名称“+”,“ - ”和“+ {}”按钮以及仅在当前版本的jqGrid中使用英文的工具提示('Add rule''Delete rule''Add subgroup''Delete group')。
  3. 焦点将另外设置为输入控件或按钮。它允许仅使用键盘的搜索对话框而无需使用鼠标。
  4. 在从搜索对话框中最终读取数据之前,将在所有输入控件上触发"change"个事件。
  5. 最后一项更改对于解决问题非常重要。

    应该修改filterData函数的实现。应该添加行

    $(this).find(".input-elm").each(function() {
        $(this).triggerHandler("change");
    });
    
    the line之前

    问题是jqGrid将'change'事件绑定到搜索对话框的所有输入字段(请参阅the lines)。在用户输入搜索数据后,将触发“更改”事件,并在{{3中查看内部数据filter(请参阅rule.datafilter的一部分}})将被修改。如果用户点击“搜索”按钮,则会获得filter当前值(请参阅the line)。问题是{<1}}事件将在<搜索“按钮上的change事件处理后的某些网络浏览器中处理。因此,最后一个搜索过滤器的输入数据可能尚未设置。在返回来自'click'的数据之前,.triggerHandler("change")对所有输入控件的调用可能会解决问题。如果可以调用一些不需要的filter事件,但可以确保change中的数据与来自的数据相同。

    我认为the line是个坏主意。

    如果使用filter选项使用searchOnEnter: true并开始使用 Enter 键进行搜索,则问题不应该由于reverting of the changes

    .triggerHandler("change")

    在处理click事件之前,焦点将显式设置为“搜索”按钮。通过方式触发$("#"+fid+"_search").focus().click(); 事件,并刷新"change"中的数据。

    我认为可以在不直接触发filter事件的情况下解决您所描述的问题。而不是那个可以包括焦点的明确设置

    change

    $("#"+fid+"_search").focus(); 事件处理程序内部(请参阅the line)。在 the line之前执行此操作非常重要,click将会被调用。