html select下拉多选 修改yselect.js插件实现下拉多选,搜索,限制选中,默认回显等操作

需求:要在select标签实现下拉多选,搜索,限制选中,默认回显等操作,之前同事用的yselect.js,网上用的简直是寥寥无几,找了半天没找到限制选中的方法,看了源代码才发现根本没有,所以自己加上了,最终实现需求。

1.全选+搜索+默认选中前n个选项

1.1效果

1.2 引入yselect.js等(源码放在最后)

yselect.js 代码如下,建议先看源码再编写代码,有些方法都是封装了的

(function ($) {$.fn.ySelect = function (options) {var defaultOptions = { placeholder: '请选择', numDisplayed: 4, overflowText: '{n} selected', searchText: '搜索', showSearch: true }if (typeof options == 'string') { var settings = options; }else { var settings = $.extend(true, {}, defaultOptions, options); }function ySelect(select, settings) { this.$select = $(select); this.settings = settings; this.create(); }ySelect.prototype = {create: function () { var multiple = this.$select.is('[multiple]') ? ' multiple' : ''; this.$select.wrap('<div class="fs-wrap' + multiple + '"></div>'); this.$select.before('<div class="fs-label-wrap"><div class="fs-label">' + this.settings.placeholder + '</div><span class="fs-arrow"></span></div>'); this.$select.before('<div class="fs-dropdown hidden"><div class="fs-options"></div></div>'); this.$select.addClass('hidden'); this.$wrap = this.$select.closest('.fs-wrap'); this.reload(); }, reload: function () {if (this.settings.showSearch) { var search = '<div class="fs-search"><input type="search" placeholder="' + this.settings.searchText + '" /><span class="fs-selectAll"><i class="fa fa-check-square-o"></i></span></div>'; this.$wrap.find('.fs-dropdown').prepend(search); }var choices = this.buildOptions(this.$select); this.$wrap.find('.fs-options').html(choices); this.reloadDropdownLabel();}, destroy: function () { this.$wrap.find('.fs-label-wrap').remove(); this.$wrap.find('.fs-dropdown').remove(); this.$select.unwrap().removeClass('hidden'); }, buildOptions: function ($element) {var $this = this; var choices = ''; $element.children().each(function (i, el) {var $el = $(el); if ('optgroup' == $el.prop('nodeName').toLowerCase()) { choices += '<div class="fs-optgroup">'; choices += '<div class="fs-optgroup-label">' + $el.prop('label') + '</div>'; choices += $this.buildOptions($el); choices += '</div>'; }else { var selected = $el.is('[selected]') ? ' selected' : ''; choices += '<div class="fs-option' + selected + '" data-value="' + $el.prop('value') + '"><span class="fs-checkbox"><i></i></span><div class="fs-option-label">' + $el.html() + '</div></div>'; }}); return choices;}, reloadDropdownLabel: function () {var settings = this.settings; var labelText = []; this.$wrap.find('.fs-option.selected').each(function (i, el) { labelText.push($(el).find('.fs-option-label').text()); }); if (labelText.length < 1) { labelText = settings.placeholder; }else if (labelText.length > settings.numDisplayed) { labelText = settings.overflowText.replace('{n}', labelText.length); }else { labelText = labelText.join(', '); }this.$wrap.find('.fs-label').html(labelText); this.$select.change();}, setwrap: function () { return "123"; },}return this.each(function () {var data = $(this).data('ySelect'); if (!data) { data = new ySelect(this, settings); $(this).data('ySelect', data); }if (typeof settings == 'string') { data[settings](); }});}window.ySelect = { 'active': null, 'idx': -1 }; function setIndexes($wrap) { $wrap.find('.fs-option:not(.hidden)').each(function (i, el) { $(el).attr('data-index', i); $wrap.find('.fs-option').removeClass('hl'); }); $wrap.find('.fs-search input').focus(); window.ySelect.idx = -1; }function setScroll($wrap) {var $container = $wrap.find('.fs-options'); var $selected = $wrap.find('.fs-option.hl'); var itemMin = $selected.offset().top + $container.scrollTop(); var itemMax = itemMin + $selected.outerHeight(); var containerMin = $container.offset().top + $container.scrollTop(); var containerMax = containerMin + $container.outerHeight(); if (itemMax > containerMax) { var to = $container.scrollTop() + itemMax - containerMax; $container.scrollTop(to); }else if (itemMin < containerMin) { var to = $container.scrollTop() - containerMin - itemMin; $container.scrollTop(to); }}//$(document).on('click', '.fs-selectAll', function () {//    $(this).parent().next().find('.fs-option.selected').click();//    $(this).parent().next().find('.fs-option').click();//    $(this).addClass('selected');//});//$(document).on('click', '.fs-selectAll.selected', function () {//    $(this).parent().next().find('.fs-option.selected').click();//    $(this).removeClass('selected');//});//全选$(document).on('click', '.fs-selectAll', function () {if ($(this).hasClass("selected")) {$(this).removeClass('selected');$(this).parent().next().find('.fs-option').removeClass('selected');$(this).parent().find(".fs-label").text("");$(this).parent().next().find('.fs-option:eq(0)').addClass('selected');$(this).parent().next().find('.fs-option:eq(0)').click();}else {$(this).addClass('selected');$(this).parent().next().find('.fs-option').addClass('selected');$(this).parent().next().find('.fs-option:eq(0)').removeClass('selected');$(this).parent().next().find('.fs-option:eq(0)').click();}})//获取选择项$.fn.ySelectVal = function () {var list = [];$(this).prev().find(".fs-options>div").each(function () {if ($(this).hasClass("selected")) {list.push($(this).attr("data-value"));}});return list;}//重新绑定数据$.fn.ySelectReload = function () {var fs_optionsObj = $(this).prev().find(".fs-options");fs_optionsObj.html("");$(this).parent().find(".fs-label").text("");var data_index = 0;$(this).prev().find('.fs-selectAll').removeClass("selected");$(this).find("option").each(function () {var fs_options = '<div class="fs-option " data-value="' + $(this).attr("value") + '" data-index="' + data_index + '"><span class="fs-checkbox"><i></i></span><div class="fs-option-label">' + $(this).text() + '</div></div>';fs_optionsObj.append(fs_options);data_index++;})}//触发全选事件$.fn.ySelectAll = function () {$(this).prev().find(".fs-selectAll").addClass('selected');$(this).prev().find(".fs-options>div").each(function () {$(this).addClass('selected');});var count = $(this).prev().find(".fs-options>div").length;$(this).parent().find(".fs-label").text("已选中 " + count + "项");//$(this).prev().find('.fs-option:eq(0)').click();//$(this).prev().find('.fs-option:eq(0)').click();}// 默认选中前n个选中$.fn.ySelectDefault = function (num) {var $options = $(this).prev().find(".fs-options>div");// 选中前n个选项$options.slice(0, num).each(function () {$(this).addClass('selected');});// 更新已选中项的数量var count = $options.filter('.selected').length;$(this).parent().find(".fs-label").text("已选中 " + count + "项");}$(document).on('click', '.fs-option', function () {var $wrap = $(this).closest('.fs-wrap'); if ($wrap.hasClass('multiple')) { var selected = []; $(this).toggleClass('selected'); $wrap.find('.fs-option.selected').each(function (i, el) { selected.push($(el).attr('data-value')); }); }else { var selected = $(this).attr('data-value'); $wrap.find('.fs-option').removeClass('selected'); $(this).addClass('selected'); $wrap.find('.fs-dropdown').hide(); }$wrap.find('select').val(selected); $wrap.find('select').ySelect('reloadDropdownLabel'); $wrap.find('select').ySelect('setwrap');}); $(document).on('keyup', '.fs-search input', function (e) {if (40 == e.which) { $(this).blur(); return; }var $wrap = $(this).closest('.fs-wrap'); var keywords = $(this).val(); $wrap.find('.fs-option, .fs-optgroup-label').removeClass('hidden'); if ('' != keywords) { $wrap.find('.fs-option').each(function () { var regex = new RegExp(keywords, 'gi'); if (null === $(this).find('.fs-option-label').text().match(regex)) { $(this).addClass('hidden'); } }); $wrap.find('.fs-optgroup-label').each(function () { var num_visible = $(this).closest('.fs-optgroup').find('.fs-option:not(.hidden)').length; if (num_visible < 1) { $(this).addClass('hidden'); } }); }setIndexes($wrap);}); $(document).on('click', function (e) {var $el = $(e.target); var $wrap = $el.closest('.fs-wrap'); if (0 < $wrap.length) {if ($el.hasClass('fs-label') || $el.hasClass('fs-arrow')) {window.ySelect.active = $wrap; var is_hidden = $wrap.find('.fs-dropdown').hasClass('hidden'); $('.fs-dropdown').addClass('hidden'); if (is_hidden) { $wrap.find('.fs-dropdown').removeClass('hidden'); }else { $wrap.find('.fs-dropdown').addClass('hidden'); }setIndexes($wrap);}}else { $('.fs-dropdown').addClass('hidden'); window.ySelect.active = null; }}); $(document).on('keydown', function (e) {var $wrap = window.ySelect.active; if (null === $wrap) { return; }else if (38 == e.which) {e.preventDefault(); $wrap.find('.fs-option').removeClass('hl'); if (window.ySelect.idx > 0) { window.ySelect.idx--; $wrap.find('.fs-option[data-index=' + window.ySelect.idx + ']').addClass('hl'); setScroll($wrap); }else { window.ySelect.idx = -1; $wrap.find('.fs-search input').focus(); }}else if (40 == e.which) { e.preventDefault(); var last_index = $wrap.find('.fs-option:last').attr('data-index'); if (window.ySelect.idx < parseInt(last_index)) { window.ySelect.idx++; $wrap.find('.fs-option').removeClass('hl'); $wrap.find('.fs-option[data-index=' + window.ySelect.idx + ']').addClass('hl'); setScroll($wrap); } }else if (32 == e.which || 13 == e.which) { $wrap.find('.fs-option.hl').click(); }else if (27 == e.which) { $('.fs-dropdown').addClass('hidden'); window.ySelect.active = null; }});$.fn.ySelectedValues = function (splitString) {var result = ""; var $selects = this.find("option:selected"); for (var i = 0; i < $selects.length; i++) { result += $selects[i].value + ((i == $selects.length - 1) ? "" : splitString); }return result;}$.fn.ySelectedTexts = function (splitString) {var result = ""; var $selects = this.find("option:selected"); for (var i = 0; i < $selects.length; i++) { result += $selects[i].text + ((i == $selects.length - 1) ? "" : splitString); }return result;}})(jQuery);

还用到了font-awesome的小图标,如果不引入的话下来搜索右边的勾选图表不会显,bootstrap看个人需求引入,jquery必须引入

    <script src="js/jquery-1.11.3.min.js"></script><link href="css/bootstrap.min.css" rel="stylesheet" type="text/css" /><link href="css/font-awesome.min.css" rel="stylesheet" type="text/css" /><link href="css/ySelect.css" rel="stylesheet" type="text/css" /><script src="js/bootstrap.min.js"></script><script src="js/ySelect.js"></script>

 1.3主要代码讲解

必须要先使用ySelect加载之后再使用其他方法

        $(".demo1").ySelect({placeholder: "请先选择一些项目", //提示信息searchText: "搜索", //下拉搜索占位符showSearch: true, //显示搜索 (true/false)numDisplayed: 4, //超出数量整合overflowText: "已选中 {n}项", //超出数量整合文本提示,{n}为数量});

默认选中前n个和默认全选调用代码

  //触发全选事件$.fn.ySelectAll = function () {$(this).prev().find(".fs-selectAll").addClass('selected');$(this).prev().find(".fs-options>div").each(function () {$(this).addClass('selected');});var count = $(this).prev().find(".fs-options>div").length;$(this).parent().find(".fs-label").text("已选中 " + count + "项");//$(this).prev().find('.fs-option:eq(0)').click();//$(this).prev().find('.fs-option:eq(0)').click();}// 默认选中前n个选中$.fn.ySelectDefault = function (num) {var $options = $(this).prev().find(".fs-options>div");// 选中前n个选项$options.slice(0, num).each(function () {$(this).addClass('selected');});// 更新已选中项的数量var count = $options.filter('.selected').length;$(this).parent().find(".fs-label").text("已选中 " + count + "项");}

调用方法如下,注意,使用了yselect后再使用  $(".demo1").val()是获取不到已选中值的,需要使用

$(".demo1").ySelectVal(),结果为['1','2']

   // 默认选中前两个选项的方法$(".demo1").ySelectDefault(2);//默认全部选中$(".demo1").ySelectAll();//获取选择项$(".demo1").ySelectVal();//重新加载$(".demo1").ySelectReload();//获取到已选中的值并且以逗号分隔console.log($("#m2").ySelectedValues(","));
//获取到已选中的text并且以逗号分隔console.log($("#m2").ySelectedTexts(","));

 2.限制选中个数(其他禁用)

2.1效果

注意,限制选中就不要加上全选的按钮。容易冲突

 2.1代码实现

页面加载的时候也需要判断长度是否为2,如果为2就设置禁用

$("#m1").change(function () {var $select = $(this);var selectedValues = $select.ySelectVal(); // 获取当前选中的值var $options = $select.prev().find(".fs-options>div"); // 获取所有的选项if (selectedValues.length == 2) {console.log("如果元素的长度为2,那么其他项就不让点击");// 禁用其他未选中的选项$options.each(function () {var $option = $(this);if (!$option.hasClass("selected")) {$option.addClass("disabled"); // 添加禁用类$option.off("click"); // 移除点击事件}});} else {console.log("选中的值小于2,允许点击其他项");// 启用所有选项的点击事件$options.each(function () {var $option = $(this);if ($option.hasClass("disabled")) {$option.removeClass("disabled"); // 移除禁用类$option.on("click", function () {// 你可以在这里添加选项点击事件的逻辑console.log("选中项:", $option.text());});}});}});

需要配合css实现

      .fs-options .disabled {pointer-events: none; /* 禁用鼠标点击 */opacity: 0.5; /* 改变样式使禁用项看起来不活跃 */}

 3.完整代码

<!--* @Description:* @Author:请叫我欧皇i* @Date: 2024-11-25 15:09:26* @FilePath: \ySelect-master\index.html
-->
<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>jQuery ySelect Plugin Demo</title><script src="js/jquery-1.11.3.min.js"></script><link href="css/bootstrap.min.css" rel="stylesheet" type="text/css" /><link href="css/font-awesome.min.css" rel="stylesheet" type="text/css" /><link href="css/ySelect.css" rel="stylesheet" type="text/css" /><script src="js/bootstrap.min.js"></script><script src="js/ySelect.js"></script><style>.container {margin-top: 50px;}.fs-options .disabled {pointer-events: none; /* 禁用鼠标点击 */opacity: 0.5; /* 改变样式使禁用项看起来不活跃 */}</style></head><body><div class="container"><select id="m1" class="demo" multiple="multiple"><option value="1">加多宝冰凉茶</option><option value="2">饮料</option><option value="3">太太乐鸡精</option><option value="4">嘉士伯啤酒</option><option value="5">成功图像类型</option><option value="6">门店类型</option><option value="7">终端类型</option></select><select id="m2" class="demo1" multiple="multiple"><option value="1">加多宝凉茶</option><option value="2">饮料</option><option value="3">太太乐鸡精</option><option value="4">嘉士伯啤酒</option><option value="5">成功图像类型</option><option value="6">门店类型</option></select><br /><!-- <button id="current" class="btn btn-primary btn-sm">查看值</button> --></div><script>$(function () {$("#m1").ySelect({placeholder: "请先选择一些项目", //提示信息searchText: "搜索", //下拉搜索占位符showSearch: false, //显示搜索 (true/false)numDisplayed: 2, //超出数量整合overflowText: "已选中 {n}项", //超出数量整合文本提示,{n}为数量});$(".demo1").ySelect({placeholder: "请先选择一些项目", //提示信息searchText: "搜索", //下拉搜索占位符showSearch: true, //显示搜索 (true/false)numDisplayed: 4, //超出数量整合overflowText: "已选中 {n}项", //超出数量整合文本提示,{n}为数量});// 调用限制最多选择两个选项的方法$(".demo1").ySelectDefault(2);$("#m1").ySelectDefault(2);var selectedValues = $("#m1").ySelectVal(); // 获取当前选中的值console.log(selectedValues.length, "测斜的长度000000");var $options = $("#m1").prev().find(".fs-options>div"); // 获取所有的选项if (selectedValues.length == 2) {console.log("如果元素的长度为2,那么其他项就不让点击");// 禁用其他未选中的选项$options.each(function () {var $option = $(this);if (!$option.hasClass("selected")) {$option.addClass("disabled"); // 添加禁用类$option.off("click"); // 移除点击事件}});}// 恢复之前选中的数据点$("#current").click(function () {console.log($("#m2").ySelectedValues(","));console.log($("#m2").ySelectedTexts(","));});});$("#m1").change(function () {var $select = $(this);var selectedValues = $select.ySelectVal(); // 获取当前选中的值var $options = $select.prev().find(".fs-options>div"); // 获取所有的选项if (selectedValues.length == 2) {console.log("如果元素的长度为2,那么其他项就不让点击");// 禁用其他未选中的选项$options.each(function () {var $option = $(this);if (!$option.hasClass("selected")) {$option.addClass("disabled"); // 添加禁用类$option.off("click"); // 移除点击事件}});} else {console.log("选中的值小于2,允许点击其他项");// 启用所有选项的点击事件$options.each(function () {var $option = $(this);if ($option.hasClass("disabled")) {$option.removeClass("disabled"); // 移除禁用类$option.on("click", function () {// 你可以在这里添加选项点击事件的逻辑console.log("选中项:", $option.text());});}});}});</script></body>
</html>

3.1源码示例地址

yselect操作select: 实现select多选,复选,全选,限制选中个数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++哈希表(原理、实现、开放寻址法)适合新手

c系列哈希的原理及实现&#xff08;上&#xff09; 文章目录 c系列哈希的原理及实现&#xff08;上&#xff09;前言一、哈希的概念二、哈希冲突三、哈希冲突解决3.1、开放寻址法3.2、删除操作3.3、负载因子四、代码实现 总结 前言 红黑树平衡树和哈希有不同的用途。 红黑树、…

了解HTTPS以及CA在其中的作用

在这个信息爆炸的时代&#xff0c;每一次指尖轻触屏幕&#xff0c;都是一次数据的旅行。但您是否真正了解&#xff0c;这些数据在通往目的地的旅途中&#xff0c;是如何被保护的呢&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种安全的网…

Flink学习连载文章8--时间语义

Time的分类 (时间语义) EventTime:事件(数据)时间,是事件/数据真真正正发生时/产生时的时间 IngestionTime:摄入时间,是事件/数据到达流处理系统的时间 ProcessingTime:处理时间,是事件/数据被处理/计算时的系统的时间 EventTime的重要性 假设&#xff0c;你正在去往地下停…

sizeof和strlen区分,(好多例子)

sizeof算字节大小 带\0 strlen算字符串长度 \0之前

Simulink的SIL软件在环测试

以基于模型的设计&#xff08;MBD&#xff09;的软件开发时&#xff0c;需要进行SIL&#xff08;软件在环测试&#xff09;。SIL测试就是在PC上验证模型是否与代码功能一致。在项目开展中&#xff0c;用在需要将控制器生成移植到硬件前&#xff0c;把控制器的模块生成代码&…

浅谈js中onmouseleave和onmouseout的区别

同步发布于我的网站 &#x1f680; 背景介绍基本概念区别详解 无子元素的情况有子元素的情况 实际应用场景 使用 onmouseleave使用 onmouseout 注意事项总结 背景介绍 在前端开发中&#xff0c;我们经常需要为元素绑定鼠标事件&#xff0c;以实现各种交互效果。onmouseleave…

【Git系列】利用 Bash 脚本获取 Git 最后一次非合并提交的提交人

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

36 基于单片机的电磁炉系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20温度传感器检测温度&#xff0c;通过八位数码管显示&#xff0c; 如果温度超过阈值&#xff0c;则蜂鸣器报警&#xff0c;红灯亮起&#xff1b;若不超过阈值&…

『 Linux 』数据链路层 - ARP协议及数据链路层周边问题

文章目录 ARP协议ARP欺骗RARP协议 DNS服务ICMP协议ping 命令正向代理服务器反向代理服务器 ARP协议 博客『 Linux 』数据链路层 - MAC帧/以太网帧中提到,当数据需要再数据链路层进行无网络传输时需要封装为MAC帧,而MAC帧的报文结构如下: 帧头部分存在两个字段分别为 “目的地址…

MySQL(数据库)

1.数据库? 数据库是管理数据(增删改查CRUD)的软件 MySQL(开源&免费) 是一个数据库软件 (客户端-服务器)结构的软件 客户端服务器通过网络进行通信 客户端(Client):主动发起请求的一方,客户端给服务器发起的数据称为请求(request) 服务器(Server):被动接受请求的一方,…

vue3----API

组合式API 1.setup 定义的数据和方法必须return出去才能够被使用 不使用this,this指向了undefined <script> export default {setup () {console.log(setup)const message this is messageconst logmessage ()>{console.log(message)}return {message,logmessag…

服务器遭受DDoS攻击后如何恢复运行?

当服务器遭受 DDoS&#xff08;分布式拒绝服务&#xff09;攻击 后&#xff0c;恢复运行需要快速采取应急措施来缓解攻击影响&#xff0c;并在恢复后加强防护以减少未来攻击的风险。以下是详细的分步指南&#xff1a; 一、应急处理步骤 1. 确认服务器是否正在遭受 DDoS 攻击 …

【maven-5】Maven 项目构建的生命周期:深入理解与应用

1. 生命周期是什么 ​在Maven出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;软件开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试及部署。虽然大家都在不停地做构建工作&#xff0c;但公司和公司间&#xff0c;项目和项目间&#xff0c;往往…

【机器学习】CatBoost 模型实践:回归与分类的全流程解析

一. 引言 本篇博客首发于掘金 https://juejin.cn/post/7441027173430018067。 PS&#xff1a;转载自己的文章也算原创吧。 在机器学习领域&#xff0c;CatBoost 是一款强大的梯度提升框架&#xff0c;特别适合处理带有类别特征的数据。本篇博客以脱敏后的保险数据集为例&#x…

lua download

https://www.lua.org/ https://www.lua.org/versions.html#5.4

基于大数据python 房屋价格数据分析预测可视化系统(源码+LW+部署讲解+数据库+ppt)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 很对人不知道选题怎么选 不清楚自己适合做哪块内容 都可以免费来问我 避免后期給自己答辩找麻烦 增加难度&#xff08;部分学校只有一次答辩机会 没弄好就延迟…

pikachu文件上传漏洞通关详解

声明&#xff1a;文章只是起演示作用&#xff0c;所有涉及的网站和内容&#xff0c;仅供大家学习交流&#xff0c;如有任何违法行为&#xff0c;均和本人无关&#xff0c;切勿触碰法律底线 目录 概念&#xff1a;什么是文件上传漏洞一、客户端check二、MIME type三、getimagesi…

Monitor 显示器软件开发设计入门二

基础篇--显示驱动方案输出接口介绍 写在前面&#xff1a;首先申明&#xff0c;这篇文章是写给那些初入显示器软件行业的入门者&#xff0c;或是对显示器没有基本知识的小白人员。如您是行业大咖大神&#xff0c;可以绕行&#xff0c;可看后期进阶文章。 上篇介绍了输入接口及相…

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…

【21-30期】Java技术深度剖析:从分库分表到微服务的核心问题解析

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 文章题目&#xff1a;Java技术深度剖析&#xff1a;从分库分表到微服务的核心问题解析 摘要&#xff1a; 本…