【问题标题】:is it possible to include an event in a javascript function?是否可以在 javascript 函数中包含事件?
【发布时间】:2011-03-21 07:43:14
【问题描述】:

我只是想知道从主 javascript 中获取 jqgrid 事件并使用另一个 javascript 以函数形式将其分开是否可行?我想做的就是这样。我有一个代码:

     ...//some code here
     serializeGridData: function(postData) {
        var jsonParams = {
            'SessionID': $('#eSessionID3').val(),
            'dataType': 'data',
            'recordLimit': postData.rows,
            'recordOffset': postData.rows * (postData.page - 1),
            'rowDataAsObjects': false,
            'queryRowCount': true,
            'sort_fields': postData.sidx
        };

        if (postData.sord == 'desc')
        {
            ...//some code here
        }           
        else
        {
            ...//some code here
        }

        return 'json=' + jsonParams;
    },

    loadError: function(xhr, msg, e) { 
        showMessage('errmsg');
    },
            ...//some code here

我想获取此代码并将其写入另一个 javascript 文件并将其作为一个函数,以便我的另一个文件可以使用这个..可能吗?

我在我的其他 javascrtip 文件中创建了类似的东西,我计划在其中放置我的所有函数。这是代码(functions.js):

function serialLoad(){
   serializeGridData: function(postData) {
      var jsonParams = {
         'SessionID': $('#eSessionID3').val(),
         'dataType': 'data',
         'recordLimit': postData.rows,
         'recordOffset': postData.rows * (postData.page - 1),
         'rowDataAsObjects': false,
         'queryRowCount': true,
         'sort_fields': postData.sidx
      };

      if (postData.sord == 'desc')
      {
          ...//some code here
      }           
      else
      {
          ...//some code here
      }
      return 'json=' + jsonParams;
   },

   loadError: function(xhr, msg, e) { 
       showMessage('errmsg');
   }
}

这不起作用并显示消息语法错误。我不知道如何纠正这个。有谁可以帮助我吗?

【问题讨论】:

    标签: javascript events function jqgrid


    【解决方案1】:

    首先回答你的正确问题。如果你在 functions.js 文件中定义了一些全局变量,例如,myGlobal:

    myGlobal = {};
    myGlobal = serializeGridData: function(postData) {
        // ... here is the implementation
    };
    

    您可以在另一个 JavaScript 文件中使用它,该文件必须包含在 functions.js 文件之后:

    serializeGridData: myGlobal.serializeGridData
    

    (只需在 jqGrid 定义中使用此类参数)。

    如果您想将serializeGridData 参数与大多数jqGrids 中的值一起使用,您可以改写functions.js 文件中serializeGridData 的默认值:

    jQuery.extend(jQuery.jgrid.defaults, {
        datatype: 'json',
        serializeGridData: function(postData) {
            // ... here is the implementation
        },
        loadError: function(xhr, msg, e) { 
            showMessage('errmsg');
        }
    });
    

    在示例中,我将默认的datatype: 'xml' jqGrid 参数覆盖为datatype: 'json'。它表明您可以设置任何 jqGrid 参数的默认值。

    在我看来,您真正需要的是使用prmNames jqGrid 参数来重命名标准 jqGrid 参数的一些默认名称。例如与

    prmNames: {
        rows:"recordLimit",
        sort: "sort_fields",
        search:null,
        nd:null
    }
    

    您将标准rows 参数重命名为recordLimit,将sidx 重命名为sort_fields,并删除要发送的_searchnd 参数。

    此外,您可以使用 postData 将一些属性定义为函数(有关详细信息,请参阅 here)。例如:

    postData: {
        SessionID: function() {
            return $('#eSessionID3').val();
        },
        rowDataAsObjects: false,
        queryRowCount: true,
        dataType: 'data',
        recordOffset: function() {
            var pd = jQuery("#list2")[0].p.postData;
            return pd.recordLimit * (pd.page - 1);
        },
        json: function() {
            var pd = jQuery("#list2")[0].p.postData;
            return {
               SessionID: $('#eSessionID3').val(),
               dataType: 'data',
               recordOffset: pd.recordLimit * (pd.page - 1),
               rowDataAsObjects: false,
               queryRowCount: true,
               sort_fields: pd.sort_fields
            };
        }
    }
    

    我在这里使用了您当前使用的json 参数,并在将要发送的参数列表中直接添加了SessionIDqueryRowCount 等参数。当然,只发送一种方式(json 或其他方式)发送您需要的附加信息就足够了。

    【讨论】:

    • 等等...好吧..我想我应该研究你的代码...我相信这可以帮助我...感谢您的帮助和您的时间...我是 jqgrid 的新手和json,我真的很感谢你的努力。我希望我能有像你一样的想法,奥列格……”)
    • @jayAnn:不客气!如果您稍后会收到有关代码的其他问题,您可以在此处提问。
    • 我已经多次阅读您的代码,但我仍然无法正确理解...我觉得它很复杂。我不知道在哪里写 jQuery.extend({....}) (在主 javascript 或 functions.js 中)和 postdata,我不知道我应该在哪里插入它以及我应该在哪里写它。 . 谢谢你 oleg :) 对不起,如果我无法理解...
    • @jayAnn:您可以执行以下操作:在 functions.js 中使用 jQuery.extend(jQuery.jgrid.defaults, ...) 更改 jqGrid 的任何默认参数。例如,您可以设置prmNamesserializeGridData。然后在主脚本中定义没有serializeGridData 参数的jqGrid,在这种情况下,默认参数将使用您在functions.js 中更改的jQuery.jgrid.defaults 中的值。
    • @jayAnn:有帮助吗?可能我只是尝试编写一个代码示例作为您下一个问题的答案。
    【解决方案2】:

    第二个例子是不正确的,因为你将一个javascript对象声明为一个函数的主体,你可以做的是:

    function serialLoad() {
        // Return an object with the required members
        return {
            serializeGridData: function(postData) { ... },
            loadError: function(xhr, msg, e) { ... }
        };
    }
    

    【讨论】:

    • 我不知道,但我的程序不正确。网格已加载..但感谢您的回答...
    • console 在“function loadError: function(xhr, msg, e) { showMessage('errmsg'); } 中显示错误消息“missing ( before form parameters)”
    • 您需要在@Felix 的回答上发表上述评论。
    • @jayAnn:啊,那是复制和粘贴错误。删除第二个function 关键字。
    • ahhh ,,,,我已经正确执行了...并且现在没有错误消息,但网格没有显示 span>
    【解决方案3】:

    您正在混合函数声明和对象字面量表示法。此语法:property: value 在使用对象字面量表示法创建对象时使用:

    var obj = {
       prop: val,
       prop2: val
    };
    

    serializeGridDataloadError 是某些对象的属性,您不能通过将它们放入函数来定义它们。

    一种方法是创建两个函数,一个用于serializeGridData,一个用于loadError,例如

    function serialLoad(postData){
      var jsonParams = {
         //...
      };
    
      if (postData.sord == 'desc') {
          //... some code here
      }           
      else {
          //... some code here
      }
      return 'json=' + jsonParams;
    }
    
    function onError(xhr, msg, e) { 
       showMessage('errmsg');
    }
    

    然后你可以在你的其他文件中将它们分配给对象:

    // ... some code here
    serializeGridData: serialLoad,
    loadError: onError,
    //... some code here
    

    另一种方法是将有问题的对象传递给函数并在那里分配属性:

    function attachLoadHandler(obj) {
        obj.serializeGridData = function(postData) {
            //...
        };
    
        obj.loadError = function(xhr, msg, e) {
            //...
        };
    }
    

    然后你必须将你创建的对象传递给那个函数:

    attachLoadHandler(obj);
    

    但我认为第一种方法更容易理解。

    【讨论】:

    • 感谢您的回复,但它不起作用......加载时它不再显示我的网格......
    • 控制台上没有错误......是的,我从来没有忘记包含我的functions.js......
    • @jayAnn:我更新了答案,onError 函数的声明是错误的。
    • 你的第一个例子显示了一个错误“在形式参数前 [Break on this error] function onError: function(xhr, msg, e) { \n"
    • @jayAnn:是的,我已经更正了。检查我的更新和我的 cmets。
    猜你喜欢
    • 2020-01-21
    • 2020-02-22
    • 1970-01-01
    • 2012-08-26
    • 2012-10-10
    • 2014-01-20
    • 2010-12-06
    • 2023-03-11
    • 2018-01-31
    相关资源
    最近更新 更多