自定义attr()方法不能给出不同的名称

时间:2016-06-29 16:35:23

标签: javascript jquery

我有以下完美的代码(由其他人编写)。问题是,如果我只是重命名 attr 方法,我会收到错误。例如,我将方法重命名为 attrx 并收到此错误:

TypeError: arg.attrx is not a function

以下是工作代码:

function Action(name) {
  this.attr = function(n) {
      if (n=="name") {
          return "action";
      }
  },
  this.val = function() { 
      return name; 
  };
}

Action.prototype.toString = function() {
    return "&" + this.attr("name") + "=" + this.val();
}

当用户触发事件时,将调用以下函数:

function serializeElements() {
  var result = "";
  for(var i = 0; i < arguments.length; i++) {
    var arg = arguments[i];
    result += (arg.attr("name") + "=" + arg.val() + "&");
  }
  return result;
}

以上是相同的代码,但 attr 方法重命名为 attrx

function Action(name) {
  this.attrx = function(n) {
      if (n=="name") {
          return "action";
      }
  },
  this.val = function() { 
      return name; 
  };
}

Action.prototype.toString = function() {
    return "&" + this.attrx("name") + "=" + this.val();
}

function serializeElements() {
  var result = "";
  for(var i = 0; i < arguments.length; i++) {
    var arg = arguments[i];
    result += (arg.attrx("name") + "=" + arg.val() + "&");
  }
  return result;
}

在将方法重命名为 attrx 或其他任何内容之后,我无法弄清楚代码无效的原因(请参阅消息顶部的错误)。

注意:网页确实包含jQuery,但我认为这不是导致问题的原因。

以下是用于调用 serializeElements

的代码
function addStatesListener() {
    $("#states").on("change", function(e) {
    var form    = $(this.form);
    var url     = form.attr("action");
    var type    = form.attr("method");
    // pass 1) jQuery 'country' and 'state' objects and 2) a query string fragment, e.g.: '&action=change_state'
    var data    = serializeElements($("#countries"), $("#states"), new Action("change_state"));
    e.preventDefault();
    $.ajax({
        url: url,
        type: type,
        data: data,
        dataType: "html",   // The type of data that you're expecting back from the server
        success: function(result) {
            $("#cities").html(result);  // list of all cities, e.g.: <option value="Albany"</option>
        }
    });
});

}

1 个答案:

答案 0 :(得分:0)

你的问题的正确答案是希望已经捕获@dinesh,你正在向你的函数传递3个参数,只有第三个参数是Action,并且你更改了.attrx方法。

考虑到您正在处理jquery对象,并且如果要清理代码,可以使用.serialize()方法而不是调用成对的.attr().val()

.serialize()是序列化表单对象的jquery方法。

因此您可以按照以下方式更改代码:

function Action(name) {
    this.serialize=function() {
        return 'name='+encodeURI(name);
    }
}

然后你的函数serializeElements

function serializeElements() {
    var args = Array.prototype.slice.call(arguments);
    return args.reduce(function(a, b){
       if (a) return a.serialize() + '&' + b.serialize();
       if (b) return b.serialize();
    });
}

然后你可以这么称呼它:

var data = serializeElements($("#countries,#states"), new Action("change_state"));

如您所见,您可以将表单元素放在jquery选择器上的逗号分隔列表中。

那就是它。