【问题标题】:Support for encoding query string or POST data in YUI?支持在 YUI 中编码查询字符串或 POST 数据?
【发布时间】:2009-07-08 07:50:43
【问题描述】:

如何使用 YUI(2.7.0 或 3.0.0 Beta)将 javascript 对象/哈希(属性和值对)编码为 URL 编码的查询字符串?

我想做相当于原型中的Object.toQueryString()

我需要它来使用 YAHOO.util.Connect 对 GET 和 POST 请求的参数进行编码。

事实证明,YAHOO.util.Connect 有一个 setForm() 方法来序列化表单,但这仍然让我无法对 GET 请求的参数或 YAHOO.util.Connect.asyncRequest() 的第四个参数进行编码传递帖子数据。

【问题讨论】:

    标签: javascript ajax yui


    【解决方案1】:

    我为自己的项目做了这个小帮手。

    var toQueryString = function(o) {
        if(typeof o !== 'object') {
            return false;
        }
        var _p, _qs = [];
        for(_p in o) {
            _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
        }
        return _qs.join('&');
    };
    
    // And to use it
    var qs = toQueryString({'foo' : 'bar'});
    

    【讨论】:

      【解决方案2】:

      YUI3 有 io-form 模块,你可以在调用中实例化使用。它允许您编写如下代码:

      YUI().use('node', 'io-form', function(Y) {
       Y.get('#formId').on('sumbit', function(e) {
              e.preventDefault();
              Y.io(postURL,
              {
                  method: "POST",
                  on: {
                      complete: on_complete_handler
                  },
                  form: {
                      id: "formId"
                  }
              });
          }
      });
      

      此代码将向 postURL 发出 POST 请求,并提交来自 id 为“formId”的表单的所有输入值。该模块也适用于 GET 请求。

      【讨论】:

      • 我的问题是关于编码 javascript 哈希/对象。关于表单,YUI 2.7.0 Connection Manager 提供了一个 setForm() 方法。
      【解决方案3】:

      我最终根据 github 上的一些代码使用了类似的东西。该函数必须处理发布数组..

      “Y”是对“YAHOO”的引用

          /**
           * Turns an object into its URL-encoded query string representation.
           *
           * @param {Object} obj   Parameters as properties and values 
           */
          toQueryString: function(obj, name) {
      
              var i, l, s = [];
      
              if (Y.lang.isNull(obj) || Y.lang.isUndefined(obj)) {
              return name ? encodeURIComponent(name) + '=' : '';
            }
      
              if (Y.lang.isBoolean(obj)) {
              obj = obj ? 1 : 0;
            }
      
            if (Y.lang.isNumber(obj) || Y.lang.isString(obj)) {
              return encodeURIComponent(name) + '=' + encodeURIComponent(obj);
            }
      
            if (Y.lang.isArray(obj)) {
              name = name; // + '[]'; don't do this for Java (php thing)
              for (i = 0, l = obj.length; i < l; i ++) {
                s.push(arguments.callee(obj[i], name));
              }
              return s.join('&');
            }
      
            // now we know it's an object.
            var begin = name ? name + '[' : '',
                end = name ? ']' : '';
            for (i in obj) {
              if (obj.hasOwnProperty(i)) {
                  s.push(arguments.callee(obj[i], begin + i + end));
              }
            }
      
            return s.join("&");
          }
      

      【讨论】:

        【解决方案4】:

        我看到 YUILibrary Ticket 2528174 指的是已接受的 contribution

        The Querystring Utility
            Provides static methods to serialize objects to querystrings and deserialize objects from querystrings.
        
            Three modules are available:
                querystring           - Both parse and stringify functionality
                querystring-parse     - Parse valid querystring into JavaScript objects
                querystring-stringify - Serialize JavaScript objects into valid query strings
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-05
          • 2015-05-10
          • 2023-03-05
          • 2021-04-22
          • 2012-02-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多