【问题标题】:Keep jQuery accordion state on postback with PHP使用 PHP 在回发时保持 jQuery 手风琴状态
【发布时间】:2012-07-23 13:01:17
【问题描述】:

我在我正在构建的网站上使用 jQuery UI 的手风琴作为子导航。问题是我一直没能找到维护页面之间状态的好方法。我想知道最好的方法是什么。

我曾考虑将手风琴的索引存储在数据库中,但对于这样的问题来说,这似乎过于复杂。有没有更好的办法?显然是 cookie 和 session,但这对于一个 subnav 来说同样复杂......有什么想法吗?

编辑:这是我的代码

$.post(
    accordion_ajax.ajaxurl,
    {
        type   : 'GET',
        action : 'accordion_ajax'
    },
    function(data){
        $(".accordion-main").accordion('option', 'collapsible', true);  
        $(".accordion-main").accordion('option', 'active', 0);
        // the accordion just does not work inside this ajax call, but if I put it outside the ajax call it works fine. Any thoughts?   
    }
);

$(".accordion-main").accordion({
    change: function(event, ui){
        $.post(
            accordion_ajax.ajaxurl,
            {
                type   : 'SET',
                action : 'accordion_ajax',
                data   : $(".accordion-main").accordion('option', 'active')

            }
        );
    }
});

【问题讨论】:

  • 隐藏字段是否必须在表单标签内并使用提交按钮提交才能回发数据?
  • 因为我已经尝试过了,但除非我点击提交按钮,否则我没有其他方法可以回发数据,对吗?
  • 可以使用ajax,无需提交
  • 我将如何使用 ajax?你能给我举个例子吗?

标签: php jquery-ui accordion state


【解决方案1】:

我会这样做:

在手风琴的 change() 处理程序中,我将通过 AJAX 调用将当前手风琴部分的索引发送到服务器:

$( "#AccordionID" ).accordion({
    change: function(event, ui) {
        $.ajax({
            type:'POST',
            url: 'urlToPhpScript.php',
            data:'function=setAccordion&selectedAccordionSection='+ $("#AccordionID").accordion('option', 'active')
        });
    }
});

在服务器端,我会将此值存储在用户会话中:

<?php
// urlToPhpScript.php
session_start();

if($_GET['function']=='getAccordion') {
    if(isset($_SESSION['currentAccordion'])) {
        return $_SESSION['currentAccordion'];
    } else {
        return 0;
    }
}

if($_POST['function']=='setAccordion') {
    $_SESSION['currentAccordion'] = $_POST['AccordionID'];  
}

然后在每个页面加载时,我都会向服务器发送一个 AJAX 调用,该调用将从用户会话中查询手风琴部分:

$(document).ready(function () {
    $.ajax({
        type: 'GET',
        url: 'urlToPhpScript.php',
        data: 'function=getAccordion',
        success: function(data) {
            $('#AccordionID').accordion('activate', data);
        }
    });
});

这样,您如何从一个页面导航到下一个页面都无关紧要,而且您不必担心在您网站的每个页面上都隐藏“currentAccordion”类型的隐藏字段。

【讨论】:

  • 这听起来很优雅。我会试一试。谢谢!
  • 谢谢,我正在整理一个简单的代码示例来配合答案。
  • 我在上面编辑了我的问题,你有什么想法为什么它不起作用? (那里有一些wordpress代码......只是让你知道你不会感到困惑)
  • 只是为了让你知道我最终将它存储在一个 cookie 中并且我通过 ajax 很好地获取了值,它只是在 ajax 调用中的手风琴设置不起作用而且我没有不知道为什么。
  • 别的。我注释掉了所有的手风琴代码,除了 active 选项,现在手风琴根本不起作用。在 ajax 调用执行时初始化手风琴是否为时已晚?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多