Ajax不会打电话给Codeigniter控制器的方法

时间:2016-05-28 09:55:03

标签: javascript php ajax codeigniter

我是ajax的初学者(根本不知道jquery)所以我一直在使用简单的ajax而没有jquery,我想要做的就是简单地调用codeigniter' s控制器方法。不知道我错了什么。这是我的ajax功能和控制器:

   function usernameOnChange() {
        var username = document.getElementById("register_username").value;
        if (username.length == 0) {
            document.getElementById("usernameGlyph").className = "glyphicon glyphicon-remove";
            return;
        } else {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.onreadystatechange = function() {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                    document.getElementById("usernameGlyph").className  = 'glyphicon glyphicon-ok';
                }
            };
            var link = "<?php echo base_url("index.php/Test/checkUsername?username="); ?>" + username ;
            xmlhttp.open("GET", link, true);
            xmlhttp.send();
        }
    }

这是我的控制器(它仍然是测试控制器只是为了看到我的ajax-codeigniter php连接正常工作)。

<?php

class Test extends CI_Controller {

public function __construct() {
    parent::__construct();
    $this->load->helper("url");
    $this->load->library("form_validation");
    $this->load->helper("security");
    $this->load->helper("form");
}

public function checkUsername($username) {
    echo "<script>alert('CODEIGNITER RESPONDED!');</scirpt>";
}

}

?>

提前致谢!

3 个答案:

答案 0 :(得分:2)

在开始使用ajax之前,需要了解ajax需要从PHP获得良好的输出才能获得完美的调用结果。在您的codeigniter控制器中,您正在回显脚本标记。使用ajax调用时请不要这样做。

示例Codeigniter控制器功能

<?php

class Test extends CI_Controller {

public function __construct() {
    parent::__construct();
    $this->load->helper("url");
    $this->load->library("form_validation");
    $this->load->helper("security");
    $this->load->helper("form");
}

public function checkUsername($username) {
    $output = array('status'=>200,"message"=>"Your Ajax is called");
    header('Content-Type:application/json;');//Please do not forgot to set headers
    echo json_encode($output);
}

}

这里控制器将提供javascript可以轻松读取的完美输出

对于jQuery

<script type="text/javascript">
    $.get('<?php echo base_url("index.php/Test/checkUsername?username=xyz"); ?>',function(data){
    alert(data['message']);
});
</script>

答案 1 :(得分:1)

首先,你的这一行会产生错误或意外结果。

var link = "<?php echo base_url("index.php/Test/checkUsername?username="); ?>" + username ;
//double quote inside double quote

应该是这样的

 var link = "<?php echo base_url('index.php/Test/checkUsername?username='); ?>" + username ;

您还需要了解site_urlbase_url函数如何生成链接

最后,我认为您的链接应该是这样的。

var link = "<?php echo base_url('index.php/Test/checkUsername/'); ?>" + username ;
 //you can remove index.php if you set your config file properly.

答案 2 :(得分:1)

好的,所以这是我发现的解决方案,它运行正常。如果当前输入的登录用户名存在于数据库中,它会将输入字段的图标范围更改为勾选。否则,它会将图标更改为交叉。别忘了添加“&amp;”通过“获取”多个参数向控制器方法发送时。

$("#login_username").keyup(function() {
    $.ajax({
        type: 'GET',
        url: '<?php echo base_url().'index.php/Test/checkLoginUsername'; ?>',
        data: 'type=' + $('#logintype').is(':checked') + '&username=' + $("#login_username").val(),
        success: function(newClassType) {
            $("#usernameLoginGlyph").removeClass().addClass(newClassType);
        }
    })
});

这是我的控制器方法,它是echos结果类的图标类型。

public function checkLoginUsername() {
    // type = true for customer; false for artist
    $type = $this->input->get('type');
    $username = $this->input->get('username');
    if ($type === "true") {
        if ($username === "" || $this->Customer_model->getCustomerByUsername($username)) {
            echo "glyphicon glyphicon-ok";
        } else {
            echo "glyphicon glyphicon-remove";
        }
    } else {
        if ($username === "" || $this->Artist_model->getArtistByUsername($username)) {
            echo "glyphicon glyphicon-ok";
        } else {
            echo "glyphicon glyphicon-remove";
        }
    }
}