javascript - Javascript 性能提升
问题描述
我正在使用 Jquery 插件来显示一个下拉列表,看起来像这样
现在在编辑页面中,此下拉菜单打开并带有选中的复选框,我在 Javascript 的帮助下执行此操作,如下所示
var setValues = $("#SelectedFrameworks").val().split(",");
for (var i = 0; i < setValues.length; i++) {
var selectedElement = $("#frameworksDropDown").find('*[data-id="' + setValues[i] + '"]');
selectedElement.find("i").addClass("fa-check-square-o").removeClass("fa-square-o");
SelectParent(selectedElement);
}
function SelectParent(_element) {
var count = 0;
for (var i = 0; i < $(_element).parent().children().length; i++) {
if ($(_element).parent().children().eq(i).find("i").attr("class") == "fa select-box fa-check-square-o") {
count++;
}
}
if (count == $(_element).parent().children().length) {
$(_element).closest("ul").siblings("i").click();
}
}
我首先将此值存储在隐藏字段中,然后使用它来检查复选框。(如代码所示)
现在的问题是,当数据很多时,它会花费太多时间。这会导致页面挂起。
我发现那个操作
selectedElement.find("i").addClass("fa-check-square-o").removeClass("fa-square-o");
需要太多时间。如何优化此代码以获得更好的结果
编辑
注意:此 HTML 是自动生成的。
谢谢。
解决方案
因此,这段代码的一大问题是调用 DOM 的次数。每次你$(el)
打电话给 document.getElementByClassName 或 id 等。这会很慢,而且不需要打那么多电话。
所以你可以改变
function SelectParent(_element) {
var count = 0;
for (var i = 0; i < $(_element).parent().children().length; i++) {
if ($(_element).parent().children().eq(i).find("i").attr("class") == "fa select-box fa-check-square-o") {
count++;
}
}
if (count == $(_element).parent().children().length) {
$(_element).closest("ul").siblings("i").click();
}
}
为此,它访问 DOM 一次,存储对元素的引用。这将减少您进行的 DOM 调用量。最大的优势当然是速度。我总是强调以 $ 开头的 jquery 变量的命名,以便更容易和更快地判断该变量将来是什么,或者是否有其他人来处理您的代码。
function SelectParent(_element) {
var count = 0;
var $element = $(_element);
var $children = $element.parent().children();
for (var i = 0, length = $children.length; i < length; i++) {
if ($children.eq(i).find("i").attr("class") == "fa select-box fa-check-square-o") {
count++;
}
}
if (count == $children.length) {
$element.closest("ul").siblings("i").click();
}
}
现在,您当然可以重构其余部分以加快速度;)
推荐阅读
- html - 如何使用freemarker删除数组中的重复元素?
- c# - OpenXML:创建工作簿,然后将验证器放入--vs. 打开工作簿,然后放入验证器
- python - Better way to create a flaskform and display it
- javascript - Ajax 回调成功:function() 不起作用
- java - 在as400框内执行时如何判断Java代码正在执行的库列表(rpgle程序调用)
- google-chrome - Chrome 在 Ant Media Server 中发布 WebRTC 流时给出“NotSupportedError”
- kubernetes - Does Istio really can't perform filter HTTPS requests based on the destination domains?
- swift - How To Get Time of Video Playback When User Closes AVPlayer
- c# - 如何在 LibUsbDotNet 的 UsbDeviceFinder 函数中使用我设备的 VID 和 PID?
- python - _pickle.UnpicklingError:无效的加载键,'D'