Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何对jqGrid的loadComplete和OnSegrow进行前后方法调用?_Javascript_Jquery_Jquery Plugins_Jqgrid_Extend - Fatal编程技术网

Javascript 如何对jqGrid的loadComplete和OnSegrow进行前后方法调用?

Javascript 如何对jqGrid的loadComplete和OnSegrow进行前后方法调用?,javascript,jquery,jquery-plugins,jqgrid,extend,Javascript,Jquery,Jquery Plugins,Jqgrid,Extend,我的网格有特殊的实现。 为此,我在onsetrow和loadComplete方法jqGrid中编写了一些代码 在onsetrow中,我需要更新全局数组;在loadComplete方法中,我必须访问全局数组,并需要在jqGrid中进行一些操作 在那之前我没事。我已经做过了。 现在我想以这样一种方式扩展这两个方法,即实现将是通用的(其他网格可以在不编写任何代码的情况下使用) 为此,我想到了以下步骤 我想用jqGrid.js在我的html中添加一个新的js(例如:jquery.jqGrid.addit

我的网格有特殊的实现。
为此,我在
onsetrow
loadComplete
方法jqGrid中编写了一些代码

onsetrow
中,我需要更新全局数组;在
loadComplete
方法中,我必须访问全局数组,并需要在jqGrid中进行一些操作

在那之前我没事。我已经做过了。 现在我想以这样一种方式扩展这两个方法,即实现将是通用的(其他网格可以在不编写任何代码的情况下使用)

为此,我想到了以下步骤

  • 我想用jqGrid.js在我的html中添加一个新的js(例如:jquery.jqGrid.additional.js)

  • 我想通过jqGrid的数据数组分配全局变量

  • 在这个js中,我想检查网格的multiselect的值

  • 如果该值为true,那么我希望扩展onsetow,loadComplete方法,使jqGrid同时执行我的方法和用onsetow,loadComplete方法编写的代码

  • 例如,我有
    preload complete
    postloadplete
    ,它们需要在
    loadComplete
    方法执行前后执行。同样,OnSetrow方法也是如此

    我在jquery.jqGrid.additional.js中编写了下面的代码,然后在jqGrid加载后没有得到警报(1),警报(2)

    它只执行jqGrid的loadComplete方法编写的代码

    var oldLoadComplete = $.fn.jqGrid.loadComplete;
    
    $.jqGrid.extend({
       loadComplete: function (){
          var ret;
          // do someting before
          alert(1);
    
          ret = oldLoadComplete.call (this);
    
          // do something after
          alert(3);
    
          return ret; // return original or modified results
       }
    });
    

    我对此做了很多尝试,花了很多时间。

    您正在尝试扩展
    $.jqGrid
    ,而不是
    $.fn.jqGrid
    。在第一行中,这意味着
    $.jqGrid
    甚至不存在,并且所有元素都将无法访问修改后的
    .jqGrid
    插件,但仍然是默认的

    尽管我试图用一个“新”的append方法扩展
    $.fn
    ,但没有成功。您可能必须显式覆盖这些方法。我可以想象jQuery本身有一些安全例程,并且在
    $.extend
    方法中内置了插件

    var oldLoadComplete = $.fn.jqGrid.loadComplete;
    
    $.fn.jqGrid.loadComplete = function( ) {
        alert('pre');
        var ret = oldLoadComplete.apply(this, arguments); // In case any arguments will be provided in future.
        alert('post');
        return ret;
    };
    
    编辑:

    忘掉这些吧。这无关紧要。在GitHub上查看了jqGrid的源代码之后,很明显jqGrid甚至没有使用类似于
    $.fn.jqGrid.loadComplete
    的东西。那是你自己编的。相反,它创建了另一个对象,该对象提供了一个可能属性和默认值的列表,然后被自定义默认值覆盖,最后被调用jqGrid时传入的函数参数覆盖

    我发现jqGrid在调用loadComplete回调之前和之后分别对匹配元素集(即
    this
    )触发两个事件
    jqGridLoadComplete
    jqGridAfterLoadComplete

    所以基本上,你不能使用你的尝试。相反,我想到的唯一解决方案是使用相同的方法覆盖jqGrid“构造函数”(即
    $.fn.jqGrid
    ),并将侦听器应用于
    ,如下所示:

    var oldJqGrid = $.fn.jqGrid;
    
    $.fn.jqGrid = function( ) {
        this.on('jqGridLoadComplete', function( jqEvt ) {
                alert('Pre');
            })
            .on('jqGridAfterLoadComplete', function( jqEvt ) {
                alert('Post');
            });
        return oldJqGrid.apply(this, arguments);
    };
    
    关于你的多选。。。我不知道你在说什么。我自己的时间非常有限,现在不得不拒绝进一步的帮助


    诚恳。

    您正在尝试扩展
    $.jqGrid
    ,而不是
    $.fn.jqGrid
    。在第一行中,这意味着
    $.jqGrid
    甚至不存在,并且所有元素都将无法访问修改后的
    .jqGrid
    插件,但仍然是默认的

    尽管我试图用一个“新”的append方法扩展
    $.fn
    ,但没有成功。您可能必须显式覆盖这些方法。我可以想象jQuery本身有一些安全例程,并且在
    $.extend
    方法中内置了插件

    var oldLoadComplete = $.fn.jqGrid.loadComplete;
    
    $.fn.jqGrid.loadComplete = function( ) {
        alert('pre');
        var ret = oldLoadComplete.apply(this, arguments); // In case any arguments will be provided in future.
        alert('post');
        return ret;
    };
    
    编辑:

    忘掉这些吧。这无关紧要。在GitHub上查看了jqGrid的源代码之后,很明显jqGrid甚至没有使用类似于
    $.fn.jqGrid.loadComplete
    的东西。那是你自己编的。相反,它创建了另一个对象,该对象提供了一个可能属性和默认值的列表,然后被自定义默认值覆盖,最后被调用jqGrid时传入的函数参数覆盖

    我发现jqGrid在调用loadComplete回调之前和之后分别对匹配元素集(即
    this
    )触发两个事件
    jqGridLoadComplete
    jqGridAfterLoadComplete

    所以基本上,你不能使用你的尝试。相反,我想到的唯一解决方案是使用相同的方法覆盖jqGrid“构造函数”(即
    $.fn.jqGrid
    ),并将侦听器应用于
    ,如下所示:

    var oldJqGrid = $.fn.jqGrid;
    
    $.fn.jqGrid = function( ) {
        this.on('jqGridLoadComplete', function( jqEvt ) {
                alert('Pre');
            })
            .on('jqGridAfterLoadComplete', function( jqEvt ) {
                alert('Post');
            });
        return oldJqGrid.apply(this, arguments);
    };
    
    关于你的多选。。。我不知道你在说什么。我自己的时间非常有限,现在不得不拒绝进一步的帮助


    真诚地。

    嗨,德里亚,谢谢你的回复。根据您的建议,我在jquery.jqGrid.additional.js中添加了上述代码。我的jqGrid如下所示,$(“#appAndContextTable”).jqGrid({datastr:jsonString,…,loadComplete:function(){alert('needtoimplement');});当我加载网格时,我得到了用loadComplete方法编写的警报。我没有收到事前和事后警报。请帮助我如何获取pre和post警报。另外,如何在我自己定义的loadComplete方法中获取属性multiselect的值?@user1591670只是关于我的帖子更新的通知。你可能想看看。另外,在发布另一个问题之前,我建议您浏览一下您试图扩展的项目的源代码。帮助很大我花了大约10分钟才弄明白jqGrid的这些东西。谢谢Derija的帮助。我的问题解决了。你真的帮了我很多。我也找到了得到它的方法