如何使用Ajax和JSON制作下拉菜单?

2024-03-04

这是我用来显示类别菜单的代码OpenCart具有不同的级别。它有效,但每次点击后它都会产生越来越多的XHR finished loading: POST and XHR finished loading: GET有时通过单击来停止页面:

<script type="text/javascript">
 _url = '';

 $(document).ready(function(){                
    $('#mnav a').on('click', function() {
        var cat = $(this).attr('id');
        _url = '&category_id=' + cat;

        $.post('index.php?route=test/category/child' + _url,
            function(data) {
               if(data.length>10){
                    $('#mnav #sub').remove();
                    $(data).insertAfter($('#mnav #' + cat));
               }
            });
    });
 });

$.ajaxPrefilter(function( options, original_Options, jqXHR ) {
    options.async = true;
});
</script>

HTML 代码:

<div id="mnav" class="list-group">
  <?php foreach ($categories as $category) { ?>
  <a id="<?php echo $category['category_id']; ?>" class="list-group-item active"><?php echo $category['name']; ?></a>
  <?php } ?>
</div>

控制器代码:

<?php
class ControllerTestCategory extends Controller {
    public function index() {
        if (isset($this->request->get['path'])) {
            $parts = explode('_', (string)$this->request->get['path']);
        } else {
            $parts = array();
        }

        $data['category_id'] = 0;
        if (isset($parts[0])) {
            $data['category_id'] = $parts[0];
        } else {
            $data['category_id'] = 0;
        }

        if (isset($parts[1])) {
            $data['child_id'] = $parts[1];
        } else {
            $data['child_id'] = 0;
        }

        $this->load->model('catalog/cat');

        $data['categories'] = array();

        $categories = $this->model_catalog_cat->getCategories(0);

        foreach ($categories as $category) {
            $children_data = array();

            $filter_data = array(
                'filter_category_id'  => $category['category_id'],
                'filter_sub_category' => true
            );

            $data['categories'][] = array(
                'category_id' => $category['category_id'],
                'name'        => $category['name'],
                'children'    => $category['children'],
                'products'    => $category['products'],
                'href'        => $this->url->link('product/category', 'path=' . $category['category_id'])
            );
        }

        $this->response->setOutput($this->load->view('test/category', $data));
    }
    public function child() {
        if (isset($this->request->get['category_id'])) {
            $this->load->model('catalog/cat');

            $data['categories'] = array();

            $categories = $this->model_catalog_cat->getCategories($this->request->get['category_id']);

            $data['x'] = '<div id="sub">';

            foreach ($categories as $category) {
                $data['x'] .= '<li>' . $category['name'] . '</li>';
            }
            $data['x'] .= '</div>';
        } else {
            $data['x'] = 'NA';
        }
        $this->response->setOutput($this->load->view('test/category', $data));
    }
}

SQL代码:

public function getCategories($parent_id = 0) {
    $sql = "SELECT c.category_id, c.parent_id, cd.name,
        (SELECT COUNT(DISTINCT ch.category_id) from category ch where ch.parent_id = c.category_id and cd.language_id = '" . (int)$this->config->get('config_language_id') . "') as children";

    $sql .= " , (SELECT COUNT(DISTINCT p.product_id) 
FROM product p  
    LEFT JOIN product_description pd ON (p.product_id = pd.product_id) 
    LEFT JOIN product_to_category p2c ON (p2c.product_id = p.product_id) 
    LEFT JOIN category_path cp ON (cp.category_id = p2c.category_id) 
WHERE 
    pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND 
    p.status = '1' AND 
    p.date_available <= NOW()) AS items";

    $sql .= " FROM category c LEFT JOIN category_description cd ON (c.category_id = cd.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c.status = '1' ORDER BY c.sort_order, LCASE(cd.name)";

    $query = $this->db->query($sql);
    return $query->rows;
}

如果您能提供所有必要的 JavaScript、jQuery 和 JSON 代码来帮助我,我将非常感激,因为我对这些主题知之甚少:-(


您可以将 post 请求的结果存储在 javascript 数组中,以便您可以重用它,请参阅以下内容:

var cachedObj = [];

$(document).ready(function(){                
  $('#mnav a').on('click', function() {
    var cat = $(this).attr('id');
    _url = '&category_id=' + cat;
    getData(cat, _url); //<-- Get data from ajax or cache
  });
});

//This function replaces the $.post call (just for example) 
function dummyPost(id, url){
  //url should be used to make the post call
  var data = "<span class='sub'>Test " + id + "</span>";
  return data;
}

function getData(id, url){
  //Try to get data from cache
  var data;
  if(cachedObj[url]) {
    data = cachedObj[url];
    console.log("Data retrived from cache");
  }
  else {
    data = dummyPost(id, url);
    cachedObj[url] = data;
    console.log("Data retrived from post");
  }
  
  $('#mnav .sub').remove();
  //$(data).insertAfter($('#mnav #' + id));
  $('#mnav #' + id).append($(data));
}
.sub{
  color: red;
  font-weight: bold;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="mnav" class="list-group">
  <a id="1" class="list-group-item active">One</a>
  <a id="2" class="list-group-item active">Two</a>
  <a id="3" class="list-group-item active">Three</a>
</div>

我已经做了dummyPost为了执行 post 请求而应该修改的函数。

您可以在我的示例日志中看到,第一次单击链接时,它会使用“post”检索其子菜单,而下一次,它会从缓存的数组中获取数据cachedObj.

我希望它对你有帮助。再见。

Update:应用于您的代码应该是这样的:

<script type="text/javascript">

  var cachedObj = []; //<-- Add an array to cache submenus

  //Add a function to retrieves data from cache or REST
  function getData(url){
    //Try to get data from cache
    if(cachedObj[url]) {
      console.log("Data retrived from cache");
    }
    else {
      $.ajax({
         type: 'GET',
         url: 'index.php?route=test%2Fcategory%2Fchild' + url,
         success: function(data) {
               cachedObj[url] = data;
               console.log("Data retrived from post");
            }),
         async:false
      });
    }
    return cachedObj[url];
 }

 $(document).ready(function(){                
    $('#mnav a').on('click', function() {
        var cat = $(this).attr('id');
        var url = '&category_id=' + cat;

        var data = getData(url); //<-- Call the new function to get data
        if(data.length>10){
           $('#mnav #sub').remove();
           $(data).insertAfter($('#mnav #' + cat));
        }
    });
 });
</script>

我无法测试它,所以它可能包含一些错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Ajax和JSON制作下拉菜单? 的相关文章

随机推荐

  • 在 ER 图中定义实体、属性和关系的基本规则是什么?

    构建 E R 图时 以下哪项必须具有关键and属性 entity 实体类型 关系类型 关系 具有关系类型的元组 在原始的实体 关系方法中 我们识别实体类型和关系 关联类型及其相关属性 在绘制 ER 图时 我们选择一组或多组可以将类型实例标识
  • 在 Windows 7 家庭普通版上找不到 IIS

    我刚刚购买了一台全新的联想 idealpad 笔记本电脑 运行 Windows 7 Home Basic 库存中没有操作系统 DVD 但笔记本电脑确实有操作系统恢复软件 如果您想将它们刻录到 DVD 上的话 我想今天大多数硬件都是这样销售的
  • Go 中如何处理 i18n?

    我在网上搜索但没有找到任何与 i18n 和 Go 相关的内容 我希望使用 Go 来开发网站 应对国际化的最佳方式是什么 go i18n http nicksnyder github io go i18n 有一些不错的功能 实施CLDR 复数
  • 如何查询 SQL Server TEXT 列中包含 XML(不是 xml 列类型)的值

    我有表文档 DOCUMENTS DOCUMENTID int USERID int CONTENT text 我在 SQL Server 数据库中将以下 XML 存储在名为 CONTENT 的 TEXT 列中
  • 如何使用 spring DSL 在camel 中记录标头值

    这看起来应该很简单 请原谅双关语 我正在尝试在 Spring DSL 路由中的 Camel 中记录标头 我已经看到了答案Java DSL https stackoverflow com questions 15111044 how to a
  • ASP.NET:显式本地化与隐式本地化?

    在我看来 隐式本地化相对于显式本地化的优势在于 如果您有多个属性要针对给定控件进行本地化 那么这是一种更经济的语法 如果您只需要本地化一些文本 我会使用 asp Localize 控件 该控件仅具有呈现到 UI 的单个属性 文本 有理由使用
  • 如何平滑圆角矩形的角,Swing?

    当我尝试制作圆角矩形时 我的角变得非常像素化 有什么办法可以平滑它们吗 这是一张图片 注意角落 以下是我子类化并重写绘制方法的按钮的代码 带有像素化角的按钮 public class ControlButton extends JButto
  • .NET 类型的私有成员的命名约定 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将参数从服务器端 PHP 传递到客户端 JavaScript 的最安全方法是什么[重复]

    这个问题在这里已经有答案了 在我的应用程序中 我严重依赖 JavaScript 来增强用户界面 但所有数据都来自数据库并由 PHP 处理 默认情况下 我使用 echo 语句来 及时 替换所需的值 如下所示 var myVariable 然而
  • 根据州名缩写在美国地图上绘制数值

    我有一个包含所有状态的数据 如下所示 在这里提供一个样本 state name value x AL 250 AK 900 MT 1000 NJ 10000 WY 500 现在我需要根据州缩写在美国地图上绘制这些数字 value x 我尝试
  • 外键未填充主键值

    我已经寻找答案但没有找到 我有 2 张桌子 两者都有自动生成的 PK 表 2 中的 PK 是表 1 中的 FK 由于它们都是自动生成的 因此我假设表 1 中的 FK 将使用表 2 自动生成的值填充 但它不起作用 表1中的FK最终为空 这是我
  • Angular Material 通过 $http 调用自动完成

    我想做的是角度材质自动完成 md 自动完成 https material angularjs org latest api directive mdAutocomplete 其中的数据是从对我的 REST API 的 AJAX 调用中动态检
  • 不使用左手递归解析布尔表达式

    我正在尝试匹配这个 f some thing something else f 某物 是一个函数调用 它是一个表达式 是一个布尔运算符 别的东西 是一个字符串 也是一个表达式 所以布尔表达式应该是 expression operator e
  • 部署新版本后,即使清除缓存后,浏览器也会看到旧版本的 Angular 应用程序

    我有一个 Angular 11 应用程序 正在使用以下命令构建用于在生产中部署 npm install npm run build prod outputHashing all 我遇到的问题是 部署后 当我使用浏览器访问应用程序的 URL
  • 如何动态添加更多组件 React Native

    我想在单击按钮后添加更多组件 您可以分享代码或想法以便我可以实施吗 如图所示 每次用户单击添加按钮时 都会添加一行 组件 这是哪里state https facebook github io react native docs state
  • 引用 Oracle 中视图的外键

    我尝试使用外键引用视图 但收到此错误 错误 ORA 02270 此列列表没有匹配的唯一键或主键 不过 我已在此视图上创建了一个主键 并在 TOAD 的 约束 选项卡中对其进行了验证 这是我试图创建的表 CREATE TABLE QUESTI
  • Cronjob:找不到命令

    我有一个如下的 cronjob 10 root cd some directory python3 FILE py gt gt Output txt 2 gt 1 如果我从常规命令行运行该命令 它工作正常 但是当从 cronjob 运行时
  • 函数内的 ggplot:它什么时候不识别参数,什么时候识别参数? [复制]

    这个问题在这里已经有答案了 考虑以下两个函数 library ggplot2 testdata lt as data frame cbind rep c 1 4 each 50 rbinom 100 50 5 names testdata
  • 在 ARMv7 的上下文中,当 mmu 必须进行页表转换时,Linux 内核一对一映射内存的优势是什么

    Linux内核虚拟地址是一对一映射 所以通过减去一个PAGE OFFSET到虚拟地址我们将得到物理地址 就是那样virt to phys http lxr free electrons com source arch arm include
  • 如何使用Ajax和JSON制作下拉菜单?

    这是我用来显示类别菜单的代码OpenCart具有不同的级别 它有效 但每次点击后它都会产生越来越多的XHR finished loading POST and XHR finished loading GET有时通过单击来停止页面