【问题标题】:Very strange behaviour jQuery load() with CodeIgniter带有 CodeIgniter 的 jQuery load() 非常奇怪的行为
【发布时间】:2011-06-02 17:35:38
【问题描述】:

我真的不知道这里发生了什么。我正在使用 jQuery load() 方法来替换页面中的一些 HTML。在这种情况下,它将用用户从列表中选择的消息替换当前消息。 除了一件重要的事情外,一切都按预期工作。返回 HTML 时,它会在其他任何内容之前添加单词“ARRAY”。没有其他信息(就像您从 var_dump() 获得的那样),也没有标签。从字面上看,只是大写字母!如果我在不使用 AJAX 的情况下加载视图,那么它会按预期呈现。唯一的区别是请求是使用 AJAX 发出的。以下是相关代码:

js: (全部包裹在ready()中)

$('.message_summary').click(function() {
        // get message id
        id = $(this).attr('id');

        // load the new message first so that user can get on with reading it
        $('#message_window').load($.baseurl+'messages/get_message/'+id);

        // mark as read
        $.get($.baseurl+'messages/ajax/mark_as_read/'+id);

        // get current tag id
        $.get($.baseurl+'messages/get_current_tag', 
            function(data){
                            // get the message count
                            $.get($.baseurl+'messages/ajax/set_new_message_count/'+data,
                                    function(msg_count)
                                    { 
                                        $('.new_message_count_'+data).html(msg_count);
                                    }
                                );
            });           
});

CI 控制器:

 public function get_message($message_id=false)
    {
        if($message_id)
        {               
            // get an individual message and prepare for display
            $message = $this->messages_m->get_single_message($message_id);

            foreach($this->tags['id'] as $index => $tag)
            { 
                $tag_options[$tag] = $this->tags['tag_name'][$index];
            }


            $main_message = array(
                                    'message_id'    => $message_id,
                                    'tag_name'      => $message->tag_name,
                                    'tag_options'   => $tag_options,
                                    'sender' => $message->first_name.' '.$message->last_name,
                                    'date_received' => date($this->config->item('date_time_format'), $message->created_at),
                                    'subject' => $message->subject,
                                    'content' => $message->message
                                );                                    
            if($this->input->is_ajax_request())
            {
                return $this->load->view('partials/message_view', $main_message);
            }
            else
            {
                return $this->load->view('partials/message_view', $main_message, true);
            }
        }

视图文件只是带有一些 php 变量的 HTML。

有人有什么想法吗?!?!

【问题讨论】:

  • 我之前没用过CI,但是我用过其他PHP MVC框架。是否存在用于 ajax 视图渲染的主模板,其中包含单词ARRAY。或者,您可以搜索您的项目(大多数编辑器/IDE 具有此功能)并搜索大写单词 ARRAY
  • 你在调试方面有什么尝试?例如,当您exit('Something') 作为第一行时会发生什么?仅根据您发布的内容,我看不到对此的任何解释,如果其他人可以,我会感到惊喜。
  • 感谢@devmatt 的建议,但我认为这不是问题所在。首先,我对整个项目进行了搜索,但一无所获。其次,当视图从 AJAX 加载时,它不会经过任何类型的模板。当页面第一次加载时,加载相同的视图没有问题,只有在通过 AJAX 加载时才会出错。
  • @Wesley Murch,我对如何调试有点不知所措!我使用 Firebug 来检查 AJAX 调用的确切响应。除了在响应中包含“ARRAY”之外,我看不出任何奇怪的地方。我试过使用 var_dump ,但没有产生任何结果。我不确定你的 exit('Something') 建议是什么意思 - 你能详细说明一下吗?
  • 好的,把它作为get_message()的第一行:if($this->input->is_ajax_request()) exit('Hello');,告诉我们你得到了什么。

标签: php javascript jquery codeigniter


【解决方案1】:

我将尝试帮助您在答案中调试,而不是埋在 cmets 中。

我们尝试将if($this->input->is_ajax_request()) exit('Hello'); 作为get_message() 的第一行,输出为Arrayhello。这让我相信,在某个地方,您正在检查 AJAX 请求并 echoing 某个数组,因为如果您尝试这样做,就会发生这种情况。

我的第一个建议:在同一个控制器中返回您的__construct() 并执行相同的操作。如果您仍然得到相同的结果,请更进一步,也许回到正在使用的库。如果您不再看到Array,请开始使用退出代码稍远一点,直到找到似乎触发的点。仅供参考,因为您说您是调试代码概念的新手,这不是 调试方式,它只是一种方式。

另外,从您的评论看来,您现在得到的是 Array 而不是大写版本?这很奇怪,听起来不太对劲。确保您正在阅读 Firebug 中的实际响应,而不是页面中屏幕上可见的内容。

旁白:一个小提示(我做的):将$this->input->is_ajax_request() 设置为像IS_XHRAJAX 这样的常量,例如在索引、常量文件或配置中的某处。它只是让它更容易使用。请求会在一个请求中从 ajax 变为非 ajax 吗?不,只需在system/core/Input.php 中查看它的源代码,它非常简单。示例:

define('AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest');

这实际上是 Input 类所做的,尽管它有点模糊。现在您可以使用:

 if (AJAX) do_ajax_stuff();

只是个人喜好,但我觉得它很有帮助 - 使用的资源略少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 2011-03-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多