我有以下完美的代码(由其他人编写)。问题是,如果我只是重命名 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>
}
});
});
}
答案 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选择器上的逗号分隔列表中。
那就是它。