我有一个 js 函数,它被表单上的操作调用两次,一次是用户通过 jQuery.change 在字段中输入文本时,第二次是提交表单时。提交表单时,它会调用该函数来执行 ajax 请求,然后它应该根据返回值停止或继续提交表单。我似乎得到的只是“未定义”的返回值。
被调用的函数是这个......
function cf_check_course_slug() {
// check the slug name is unique
var course_id = $('#Course_Id').val();
var course_slug = $('#Slug').val();
if(course_slug!='') {
// call script via ajax and ensure it is not already assigned
$.ajax({
type: "GET"
, url: "/courses/course_slug"
, data: { cid: course_id, slug: course_slug }
, async: false
}).done(function(response) {
// if we have a duplicate course slug then notify user
if(response=='duplicate') {
showErrorMessage('The SLUG created from the LINK NAME you have entered is already being used by another course, please edit the LINK NAME.')
return false;
} else {
return true;
}
});
}
}
提交表单时,它会在 javascript 中触发以下代码...
$(document).ready(function () {
// check we are in the correct module before firing this script
if($('#course-form').length > 0) {
// check the link name has created a unique slug
$('#LinkName').change(function() {
cf_check_course_slug();
});
// check the course record form prior to saving
$('form').submit(function() {
if(!cf_check_course_slug()) {
return false;
}
});
}
});
此 cf_ 函数调用 CI 中的控制器,该控制器对数据库执行检查以检查 slug 是否重复,如果是则返回字符串“重复”。如果我更新链接名称并检查.change,它会完美运行。
我认为它必须是函数的异步设置的问题,就好像我将它手动编码到提交 js 中一样,它按预期工作 - 虽然,我宁愿让它尽可能干燥。
任何指针都会很棒。
更新 #1 下面是控制器中的以下代码,并从 javascript 函数中调用。
function course_slug() {
// first check this request has come via ajax
if($this->input->is_ajax_request()) {
$iCourse_Id = $this->input->get('cid', true);
$sSlug = $this->input->get('slug', true);
// load the model and data
$this->load->model('Course_Model');
$aCourses = $this->Course_Model->get_courses_by_category();
// check each course and perform a check on the slug
$output = '';
foreach($aCourses as $aCourse) {
// if we are dealing with an existing course, omit the Course_Id from the course dataset
if($iCourse_Id && is_numeric($iCourse_Id)) {
if($aCourse['Course_Id']!=$iCourse_Id && $aCourse['Active']==1 && $aCourse['Slug']==$sSlug) {
$output = 'duplicate';
}
} else {
// we are dealing with a new course, check through ALL courses in the dataset
if($aCourse['Slug']==$sSlug) {
$output = 'duplicate';
}
}
}
// spit out the result
$this->output->set_content_type('application/json')->set_output(json_encode($output));
} else {
// redirect to course homepage
redirect('courses');
}
}