Codeigniter - AJAX 请求工作,如何处理标准请求?

li9yvcax  于 2023-03-06  发布在  其他
关注(0)|答案(1)|浏览(130)

我和Codeigniter一起工作,我想解决以下问题。
我试图ajaxify我的项目,这工作完美。
AJAX onclick事件起作用了。
但当我通过浏览器访问网址时(例如,通过外部网站访问我的主页)
当然,不会显示任何内容,因为它不是 AJAX 请求。
我试了几样东西,但我都做不好。

文件:应用程序/核心/我的控制器

class MY_Controller extends CI_Controller
{
    protected $templatedata = array();
    public function __construct()
    {
        parent::__construct();
    //collect all css, js stuff
        //$this->templatedata['css'] = all css stuff and so on
    } 

    
    
    public function __destruct()
    {
    parent::__destruct();
    echo $this->load->view('deskapp2/html/index',$this->templatedata,true);
    }
}

所以首先我收集我的css和js文件。
在析构函数中,我回显我的主模板。

文件:应用程序/视图/桌面应用程序2/html/索引

<html>
  <head>
     <!-- loop css files -->
  </head>
  <body>
  
    <!-- part of the menu -->
    <li><a class="loveit" rel="index" href="<?php echo $base;?>welcome">Test 1</a></li>
    <li><a class="loveit" rel="mytest" href="<?php echo $base;?>welcome/mytest">Test 2</a></li>

    <!-- this is for the ajax-request -->
    <div id="showmystuff"></div>

    <!-- this is for the non-ajax-request -->
    <?php echo $content;?>

  <!-- other js files -->
  <script type="text/javascript">
$(document).ready(function(){
    
    $('.loveit').click(function (e) {
    
    var targetUrl = $(this).attr('href');
    var targetUri = $(this).attr('rel');
    
    var arrUrl = targetUri.split('/');
    
    //alert(arrUrl);
    //url:"http://localhost/3113/public/ajax/index"
    e.preventDefault();
    window.history.pushState("","",targetUrl);
    $.ajax({
        url:"http://localhost/3113/public/ajax/index",
        type: "POST",
        data:{arr:targetUri},
        dataType:"html",
        success:function(data){
            //alert('test');
            $('#showmystuff').html('<b>'+data+'</b>');
            
        },
        error:function (){
            alert('Something went wrong');
        },
    });
    
}); 
});
</script>
  </body>
</html>

文件:控制器/ AJAX .php

这个控制器用于 AJAX 调用。

class Ajax extends CommonController {

    public function __construct()
    {
        parent::__construct();
    }
    
    public function index()
    {
        if($this->input->is_ajax_request())
        {
            echo 'You are here: '.$this->input->post('arr'); //shows the full uri-string of the link which is clicked, see javascript in index.html
        }
    }
    
    public function __destruct()
    {
        parent::__destruct();
    }
}

当然,我的计划是根据URI从数据库加载所有内容。

文件:控制器/欢迎.php

class Welcome extends FrontendController {

    
    
    
    public function __construct()
    {
        parent::__construct();
        //some stuff
    }

    public function mytest()
    {
        if($this->input->is_ajax_request())
        {
            echo $this->load->view('welcome_message', NULL, true);
        }
        else
        {   
            $this->templatedata['content'] = 'some stuff';
        }
    }
    
    public function index()
    {
        if( !$this->input->is_ajax_request())
        {
            $this->templatedata['content'] = 'load from db...';
        }
    }
    
        
    
    public function __destruct()
    {
        parent::__destruct();
    }
}

我知道Ajax控制器并不是真正必要的。:D
我只是玩玩。

摘要:

如何区分ajax请求和非ajax请求?
有什么提示吗?:)
感谢所有读到这篇文章的人。
就像我说的,我不是职业球员,我只是到处打球来提高自己。

5rgfhyps

5rgfhyps1#

很难可靠地区分 AJAX 调用、浏览器链接请求或页面表单请求,因为它们都支持HTTP方法,如POST、GET、DELETE和Put,唯一的例外是浏览器链接请求只能使用GET方法。
区分它们的一个解决方案是在客户端的 AJAX 请求中包含一个唯一的头纯ajax示例:

const xhr = new XMLHttpRequest();
xhr.open('POST', 'your-url');
xhr.setRequestHeader('X-Is-Ajax-Request'', 'True');
xhr.onload = function() {
  if (xhr.status === 200) {
    // handle successful response here
  } else {
    // handle error response here
  }
};
xhr.onerror = function() {
  // handle error response here
};
xhr.send(data); // your data here

jQuery. AJAX 示例

$.ajax({
  url: 'your-url',
  method: 'POST',
  headers: {
    'X-Is-Ajax-Request': 'True'
  },
  data: {
    // your data here
  },
  success: function(response) {
    // handle successful response here
  },
  error: function(error) {
    // handle error response here
  }
});

您可以检查PHP代码中是否存在这个头,以确定请求是否通过 AJAX 发送。
PHP代码示例:

function is_ajax_request() {
  return $_SERVER['X-Is-Ajax-Request'] == "True";
}

相关问题