Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过选择元素选项加快jQuery搜索速度_Jquery_Html_Vbscript - Fatal编程技术网

通过选择元素选项加快jQuery搜索速度

通过选择元素选项加快jQuery搜索速度,jquery,html,vbscript,Jquery,Html,Vbscript,我正在使用客户端VBScript将一个旧的经典ASP应用程序升级为使用jQuery的更现代的框架。在本例中,我的jQuery替换在IE8中的运行速度明显慢于以前的VBScript。以下是我要替换的脚本: Function Find() name = Ucase(MyForm.SearchBox.value) For x = 0 to MyForm.ComboBox.Length - 1 If Ucase(Left(MyForm.ComboBox.options(x).text,l

我正在使用客户端VBScript将一个旧的经典ASP应用程序升级为使用jQuery的更现代的框架。在本例中,我的jQuery替换在IE8中的运行速度明显慢于以前的VBScript。以下是我要替换的脚本:

Function Find()
  name = Ucase(MyForm.SearchBox.value)
  For x = 0 to MyForm.ComboBox.Length - 1
    If Ucase(Left(MyForm.ComboBox.options(x).text,len(name)))=name Then
      MyForm.ComboBox.options(x).Selected = True
      Exit Function
    End If
  Next
End Function 
这是我的替代者:

var text = $('#SearchBox').val();
$('#ComboBox option').each(function () {
  if ($(this).text().toUpperCase().indexOf(text.toUpperCase()) == 0) {
    $(this).prop('selected', true);
    return false;
  }
});
运行VBScript时完全没有延迟/冻结。用户可以随心所欲地快速键入,搜索也会继续进行。在同一台机器上,使用相同的数据,jQuery解决方案对文本的响应有非常明显的延迟;在搜索过程中,键盘条目似乎被冻结

ComboBox元素是一个HTML选择,包含大约3500个选项元素。此方法在搜索框的keyup事件中触发


我可以进行哪些优化,使jQuery的运行速度与旧的VBScript一样快?

现在,使用这一行,它应该可以加快速度:

var t = $('#SearchBox').val().toUpperCase();

$('#ComboBox > option[value="' + t + '"]').attr('selected', true); 
在测试代码以获得此结果时,我的JSFIDLE如下:


我最终实现了对排序选项的二进制搜索。我猜jQuery引擎在IE8上的效率不如VBScript引擎在这类搜索上的效率

var searchFoo = function(text) {
    var searchFor = text.toUpperCase();
    var options = $('#ComboBox > option');

    var low = 0;
    var mid;
    var high = options.length - 1;
    var target;

    while (low <= high) {
        mid = Math.ceil(low + (high - low) / 2);
        target =
          options.eq(mid).text().toUpperCase().substring(0, searchFor.length);

        if (searchFor < target) {
            high = mid - 1;
        } else if (searchFor > target) {
            low = mid + 1;
        } else {
            // We found an option that matches. We want the *first* option that
            // matches, so search up through the array while they still match.
            while (mid > 0) {
                target =
                  options.eq(mid - 1).text().toUpperCase()
                         .substring(0, searchFor.length);
                if (searchFor == target) {
                    mid--;
                } else {
                    return options.eq(mid);
                }
            }
            return options.eq(mid);
        }
    }

    return null;
}

一个建议是声明var$this=$this;并多次使用$this变量而不是$this,这将使jQuery每次都搜索对象。但我不确定在这种情况下它会对您有多大帮助!在循环之外获取大写搜索值是一个很好的优化;谢谢然而,除非我遗漏了什么,否则你的测试是不一样的;我正在做一个不区分大小写的程序,首先比较每个选项的文本。哦,当然,你是100%正确的-在我的解决方案中完全忘记了这一点。在这种情况下,我能优化的代码最多就是JSFIDLE中注释掉的解决方案。而且,对于3500元素循环,使用一次以上的元素名称越短,使用的速度就越快,例如make var t=$this.text;等等。如果以开头是阻止您使用上述代码的唯一原因,那么您可以将jQuery选择器更改为'ComboBox>option[value^='+t+']'。。。主要区别在于[]内的^=选择以提供的文本开头的所有属性。