我正在进行ajax调用,从服务器返回一些数据。我在来自ajax调用的数据上处理字符串函数。根据我的知识,我可以看到字符串操作在ajax调用结束之前开始。经常给我未定义的错误。这是我的ajax电话
$.ajax({
type: "POST",
url: "/add_director",
headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
data: formData,
cache: false,
contentType: false,
processData: false,
success: function(data) {
$('#addDirModal').modal('hide');
insertDirector(data);
},
error : function(xhr ,status ,error)
{
console.log(xhr);
alert(xhr);
}
});
这是我的insertDirector函数
function insertDirector(data){
console.log(data);
if (data.msg == "1") {
$.each(data,function(key,value){
var dir_name = value.dir_name;
var dir_pan = value.dir_pan;
var dir_din = value.dir_din;
var dir_addr = value.dir_addr;
var dir_id = value.id;
var dir_img = value.dir_img;
if (dir_name.val().length > 15) {
var dir_r_name = dir_name.substr(0,15);
}
else{
var dir_r_name = dir_name;
}
});
}
}
当我处理substr()
时,它会抛出错误Cannot read property 'val' of undefined
。我可以看到这是因为substr()
在ajax请求完成之前执行。我该如何解决 ?
EDITED
以下是回复
{"msg":"1","director":{"dir_name":"Naveen","dir_pan":"AAAAA1111B","dir_din":"123456","dir_addr":"dsadasdasdasdsadasdas","dir_img":"1490852438.jpg","user_id":3,"updated_at":"2017-03-30 05:40:38","created_at":"2017-03-30 05:40:38","id":15}}
答案 0 :(得分:0)
不清楚为什么你在这里使用$.each
(你可以省略它并使用data.director
而不是value
),但如果你的数据有可能包含几个&#39 ;导演'对象并且您希望遍历所有对象,然后您应该更改insertDirector
代码以跳过' msg'密钥,因为它没有dir_name, dir_plan, ...
属性:
function insertDirector(data) {
console.log(data);
if (data.msg == "1") {
$.each(data, function (key, value) {
if (key == "director") { //or if (key != "msg")
var dir_name = value.dir_name;
var dir_pan = value.dir_pan;
var dir_din = value.dir_din;
var dir_addr = value.dir_addr;
var dir_id = value.id;
var dir_img = value.dir_img;
var dir_r_name = (dir_name.length > 15 ? dir_name.substr(0, 15) : dir_name);
//if (dir_name.length > 15) {
// var dir_r_name = dir_name.substr(0, 15);
//}
//else {
// var dir_r_name = dir_name;
//}
}
});
}
}
另请注意,dir_name.val().length
错误,因为dir_name是一个字符串(.val()
不是必需的)
答案 1 :(得分:0)
变化
if (dir_name.val().length > 15) {
var dir_r_name = dir_name.substr(0,15);
}
到
if (dir_name.length > 15) {
var dir_r_name = dir_name.substr(0,15);
}
答案 2 :(得分:0)
尝试这种方式:
function insertDirector(data) {
console.log(data);
if (data.msg == "1") {
var dir_name = data.director.dir_name;
var dir_pan = data.director.dir_pan;
var dir_din = data.director.dir_din;
var dir_addr = data.director.dir_addr;
var dir_id = data.director.id;
var dir_img = data.director.dir_img;
if (dir_name.length > 15) {
var dir_r_name = dir_name.substr(0, 15);
}
else {
var dir_r_name = dir_name;
}
}
}
答案 3 :(得分:0)
看到您发布的数据后,很容易发现问题。 这里的问题是:
你的职能:
function insertDirector(data){
console.log(data);
if (data.msg == "1") {
$.each(data,function(key,value){
var dir_name = value.dir_name;
var dir_pan = value.dir_pan;
var dir_din = value.dir_din;
var dir_addr = value.dir_addr;
var dir_id = value.id;
var dir_img = value.dir_img;
if (dir_name.val().length > 15) {
var dir_r_name = dir_name.substr(0,15);
}
else{
var dir_r_name = dir_name;
}
});
}
}
这里,当你执行$ .each时,将遍历数据中的每个对象。现在,数据中的第一个值是msg:1。这不是一个对象。因此,在第一次迭代时,键是' msg'但价值是' 1' 。现在这个值不能有 dir_name,因此返回。因此,dir_name.val()会生成错误。
试试这样:
function insertDirector(data){
console.log(data);
if (data.msg == "1") {
$.each(data,function(key,value){
if(key==="director"){
var dir_name = value.dir_name;
var dir_pan = value.dir_pan;
var dir_din = value.dir_din;
var dir_addr = value.dir_addr;
var dir_id = value.id;
var dir_img = value.dir_img;
if (dir_name.val().length > 15) {
var dir_r_name = dir_name.substr(0,15);
}
else{
var dir_r_name = dir_name;
}
}
});
}
}