【问题标题】:Joomla and AJAXJoomla 和 AJAX
【发布时间】:2017-03-24 22:25:29
【问题描述】:

我很难让下面的 ajax 调用在我的 Joomla 3.6 组件中工作。下面的 javascript 函数的工作原理是它确实返回数据并将其显示在页面中——一瞬间——然后页面重新加载,我得到 view.html.php 的结果,这不是我的这里需要。无论我将 async 属性设置为 true 还是 false,我都会得到相同的结果。将 async 设置为 true 会更快地发生。 view.raw.php 中返回的数据很好。我必须避免重新加载 view.html.php。 javascript函数getCase()由按钮的“onclick”调用,我总是在测试之前清除缓存。 谢谢。

    function getCase(getDataVal) 
{
    var examcaseid = ($('examcase_id')) ? $('examcase_id').value : -1;
    jQuery.ajax({
        type: 'GET',
        url: 'index.php?option=com_casecreator&view=examcase&format=raw&layout=edit&id='+examcaseid+'&getdata='+getDataVal,
        dataType: 'html',
        contentType: 'text/html; charset=\"utf-8\"',
        async: true,
        success: function (data, status, jq) {
            $('rc_xml_display').innerHTML = data;
            //alert('In getCase(), rc_xml_display is: '+$('rc_xml_display').innerHTML);
        },
        error: function (jq, status, e) {
            alert('Unable to retrieve case.'+JSON.stringify(jq));
        }
    });

    return;
}

view.raw.php 中的整个 display() 函数:

    public function display($tpl = null)
{
    $app            = JFactory::getApplication();
    $getdata        = $app->input->get('getdata');
    $case_index     = !empty($app->getUserState('case_index')) ? $app->getUserState('case_index') : 0;

    if ($getdata == 'nextcase' || $getdata == 'previouscase' || $getdata == 'initialcase') {
        $app->setUserState('active_tab', 'browsecases');
        $cases_arr = $app->getUserState('rc_cases');

        switch ($getdata) {
            case 'nextcase':        $case_index++; break;
            case 'previouscase':    $case_index--; break;
            case 'initialcase':     $case_index = 0; break;
            case 'default':         break;
        }
        if ($case_index < 0) {
            $case_index = 0; 
            $msg = 'You have reached the first case in the result set.';
            $app->enqueueMessage($msg, 'warning');
        }
        if ($case_index >= count($cases_arr)) {
            $case_index = count($cases_arr)-1;
            $msg = 'You have reached the last case in the result set.';
            $app->enqueueMessage($msg, 'warning');
        }

        if ( !empty($cases_arr[$case_index]) ) {
            $app->setUserState('case_index', $case_index);
            $app->setUserState('current_case', $cases_arr[$case_index]);
        }

        header("Content-Type: text/html; charset=utf-8");
        print $app->getUserState('current_case');
        $app->close();
    }
}

【问题讨论】:

  • 你手动调用了url吗?它是否包含 html/head/body 标签?有一些插件会导致 format=raw url 参数出现问题,而是呈现完整的 HTML 页面。
  • html数据实际上是PHP代码中生成的一个片段,所以并不是一个完整的文档,用URL调用。
  • 只是为了确保我们在同一页面上:您通过此 ajax url 加载的文档除了您的数据之外不包含任何其他内容?如果您使用 $('rc_xml_display').html(data); 行为会有所不同吗?还是把这条线注释掉?
  • 不,这根本没有帮助。使用 $('rc_xml_display').html(data);实际上最终没有显示预期的数据,即使在使用innerHTML时我得到它的瞬间。我真的不相信问题出在javascript上。我相信这与 Joomla MVC 框架处理 AJAX 请求的方式有关,因为数据完全按照我的预期返回给 AJAX 调用。然后页面重新加载 view.html.php。那是我不希望发生的事情。
  • 调用 $('rc_xml_display') 实际上没有任何意义,因为 'rc_xml_display' 不是有效的选择器。我希望#rc_xml_display 或类似的东西。你有一个可以看到这种行为的网站吗?

标签: ajax joomla


【解决方案1】:

不确定您是否以理想的方式进行操作。请按照我们的简单指南here 使用 Joomla Ajax 组件。

无论如何,您的“examcase”视图应该在回显数据后立即有一个 die(),以免将控制权转移到其他地方(如果您需要更多解释,请告诉我)。

【讨论】:

  • 我假设“死”你的意思是 close() 我肯定已经包括在内:[code] header("Content-Type: text/html; charset=utf-8");打印 $app->getUserState('current_case'); $应用程序->关闭(); [代码]
  • No - die 表示die();
  • 另外,由于这是一个自定义组件,而我对 Joomla MVC 框架的理解是“每页一个组件”,我真的不知道如何将 com_ajax 与我的组件结合使用,但是我会阅读您发布的页面。
  • 我在此应用程序中实现的其他 AJAX 调用与 JFactory::getApplication()->close(); 完美配合;
  • 完成回显数据(回显数据的位置)后,在末尾添加die();。试试看。
猜你喜欢
  • 2012-09-23
  • 2013-08-26
  • 2016-09-05
  • 2014-09-19
  • 2012-10-19
  • 2014-01-12
  • 2013-03-26
  • 2013-04-16
  • 2012-07-30
相关资源
最近更新 更多