Ajax 乔姆拉和阿贾克斯

Ajax 乔姆拉和阿贾克斯,ajax,joomla,Ajax,Joomla,为了让下面的ajax调用在我的Joomla 3.6组件中工作,我花了很长时间。下面的javascript函数的工作原理是,它确实返回数据并在页面中显示--在一瞬间--然后页面重新加载,我得到view.html.php的结果,这不是我在这里需要的。无论我将async属性设置为true还是false,都会得到相同的结果。如果将async设置为true,则会更快。在view.raw.php中返回的数据没有问题。我必须避免重新加载view.html.php。javascript函数getCase()是通

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

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();
    }
}
公共功能显示($tpl=null) { $app=JFactory::getApplication(); $getdata=$app->input->get('getdata'); $case\u index=!empty($app->getUserState('case\u index'))?$app->getUserState('case\u index'):0; 如果($getdata=='nextcase'| |$getdata=='previouscase'| |$getdata=='initialcase'){ $app->setUserState('active_tab','browsecases'); $cases_arr=$app->getUserState('rc_cases'); 交换机($getdata){ 案例'nextcase':$case_index++;break; 案例“previouscase”:$case_索引--;break; 案例'initialcase':$case_index=0;中断; 案例“默认”:中断; } 如果($case_索引<0){ $case_索引=0; $msg='您已到达结果集中的第一个案例'; $app->enqueueMessage($msg,'warning'); } 如果($case\u index>=计数($cases\u arr)){ $case\u index=计数($cases\u arr)-1; $msg='您已到达结果集中的最后一个案例'; $app->enqueueMessage($msg,'warning'); } 如果(!空($cases\u arr[$case\u index])){ $app->setUserState($case\u index',$case\u index); $app->setUserState('current_case',$cases_arr[$case_index]); } 标题(“内容类型:text/html;字符集=utf-8”); 打印$app->getUserState('current_case'); $app->close(); } }
不确定您是否以理想的方式完成。请按照我们的简单指南使用Joomla Ajax组件


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

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


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

您是否手动调用了url?它是否包含html/head/body标记?有一些插件会导致format=raw url参数出现问题,并呈现完整的HTML页面。HTML数据实际上是PHP代码中生成的片段,所以它不是一个用URL调用的完整文档。只是为了确保我们在同一个页面上:通过这个ajax URL加载的文档除了数据之外不包含任何内容?如果使用$('rc_xml_display').html(数据),行为是否有所不同;还是把这句话删掉?不,那根本没用。使用$('rc_xml_display').html(数据);实际上最终没有显示预期的数据,即使是在使用innerHTML的瞬间。我真的不相信问题出在javascript上。我相信这与Joomla MVC框架处理AJAX请求的方式有关,因为数据返回给AJAX调用的方式与我预期的完全一致。然后页面将重新加载view.html.php。这就是我不想发生的事情。调用$('rc\u xml\u display')实际上毫无意义,因为'rc\u xml\u display'不是有效的选择器。我希望#rc#uxml#显示或类似的东西。你有一个可以看到这种行为的网站吗?你是否手动调用了url?它是否包含html/head/body标记?有一些插件会导致format=raw url参数出现问题,并呈现完整的HTML页面。HTML数据实际上是PHP代码中生成的片段,所以它不是一个用URL调用的完整文档。只是为了确保我们在同一个页面上:通过这个ajax URL加载的文档除了数据之外不包含任何内容?如果使用$('rc_xml_display').html(数据),行为是否有所不同;还是把这句话删掉?不,那根本没用。使用$('rc_xml_display').html(数据);实际上最终没有显示预期的数据,即使是在使用innerHTML的瞬间。我真的不相信问题出在javascript上。我相信这与Joomla MVC框架处理AJAX请求的方式有关,因为数据返回给AJAX调用的方式与我预期的完全一致。然后页面将重新加载view.html.php。这就是我不想发生的事情。调用$('rc\u xml\u display')实际上毫无意义,因为'rc\u xml\u display'不是有效的选择器。我希望#rc#uxml#显示或类似的东西。你有一个可以看到这种行为的网站吗?我假设“die”是指close(),我肯定包括:[code]标题(“内容类型:text/html;charset=utf-8”);打印$app->getUserState('current_case');$app->close();[code]No-die表示
die()。此外,由于这是一个自定义组件,而且我对Joomla MVC框架的理解是“每页一个组件”,因此我不知道如何将com_ajax与我的组件结合使用,但我将阅读您发布的页面。我在此应用程序中实现的其他ajax调用与JFactory::getApplication()配合使用效果非常好->close();完成数据回显(回显数据的位置)后,添加
die()在末尾。试试看,我猜“死”是指close(),我肯定包括了:[code]head
    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();
    }
}