在IE6 / 7上挂起UI的Javascript

时间:2011-04-26 12:07:39

标签: javascript jquery google-maps-api-3

任何人都可以建议我编写的函数的性能改进(下面,javascript有点jquery)?或者指出任何明显的基本缺陷?基本上我有一个javascript谷歌地图和一组基于列表的结果,并通过复选框点击触发该功能,查看复选框的选择(每个标识一个'过滤器')并相应地对数组数据进行处理,改变DOM并根据它更新Google地图标记。那里还有一个'假的'加载器图像,只是在延迟时间,以便在UI挂起之前动画!

function updateFilters(currentCheck) {
    if (currentCheck == undefined || (currentCheck != undefined && currentCheck.disabled == false)) {
        var delay = 0;
        if(document.getElementById('loader').style.display == 'none') {
            $('#loader').css('display', 'block');
            delay = 750;
        }
        $('#loader').delay(delay).hide(0, function(){        
            if (markers.length > 0) {
                clearMarkers();
            }

            var filters = document.aspnetForm.filters;
            var markerDataArray = [];
            var filterCount = 0;
            var currentfilters = '';
            var infoWindow = new google.maps.InfoWindow({});

            for (i = 0; i < filters.length; i++) {
                var currentFilter = filters[i];
                if (currentFilter.checked == true) {
                    var filtername;
                    if (currentFilter.parentNode.getElementsByTagName('a')[0].textContent != undefined) {
                        filtername = currentFilter.parentNode.getElementsByTagName('a')[0].textContent;
                    } else {
                        filtername = currentFilter.parentNode.getElementsByTagName('a')[0].innerText;
                    }
                    currentfilters += '<li>' + $.trim(filtername) +
                        $.trim(document.getElementById('remhide').innerHTML).replace('#"','#" onclick="toggleCheck(\'' + currentFilter.id + '\');return false;"');

                    var nextFilterArray = [];
                    filterCount++;
                    for (k = 0; k < filterinfo.length; k++) {
                        var filtertype = filterinfo[k][0];
                        if (filterinfo[k][0] == currentFilter.id) {
                            var sitearray = filterinfo[k][1];
                            for (m = 0; m < sitearray.length; m++) {
                                var thissite = sitearray[m].split(',');
                                if (filterCount > 1) {
                                    nextFilterArray.push(thissite[2] + '|' + thissite[1]
                                + '|' + thissite[0]);
                                } else {
                                    markerDataArray.push(thissite[2] + '|' + thissite[1]
                                + '|' + thissite[0]);
                                }
                            }
                        }
                    }
                    if (filterCount > 1) {
                        var itemsToRemove = [];
                        for (j = 0; j < markerDataArray.length; j++) {
                            var exists = false;
                            for (k = 0; k < nextFilterArray.length; k++) {
                                if (markerDataArray[j] == nextFilterArray[k]) {
                                    exists = true;
                                }
                            }
                            if (exists == false) {
                                itemsToRemove.push(j);
                            }
                        }
                        var itemsRemoved = 0;
                        for (j = 0; j < itemsToRemove.length; j++) {
                            markerDataArray.splice(itemsToRemove[j]-itemsRemoved,1);
                            itemsRemoved++;
                        }
                    }
                }
            }


            if (currentfilters != '') {
                document.getElementById('appliedfilters').innerHTML = currentfilters;
                document.getElementById('currentfilters').style.display = 'block';
            } else {
                document.getElementById('currentfilters').style.display = 'none';  
            }

            if (filterCount < 1) {
               for (j = 0; j < filterinfo.length; j++) {
                    var filtertype = filterinfo[j][0];
                    if (filterinfo[j][0] == 'allvalidsites') {
                        var sitearray = filterinfo[j][1];
                        for (m = 0; m < sitearray.length; m++) {
                            var thissite = sitearray[m].split(',');
                            markerDataArray.push(thissite[2] + '|' + thissite[1]
                                + '|' + thissite[0]);
                        }
                    }
                }
            }

            var infoWindow = new google.maps.InfoWindow({});

            var resultHTML = '<div id="page1" class="page"><ul>';

            var count = 0;
            var page = 1;
            var paging = '<li class="selected"><a href="#" title="' + page + '" onclick="togglePaging(\'' + page + '\');return false;">1</a></li>';

            for (i = 0; i < markerDataArray.length; i++) {
                var markerInfArray =  markerDataArray[i].split('|');
                var url = '';
                var name = '';
                var placename = '';
                var region = '';
                var summaryimage = 'images/controls/placeholder.gif';
                var summary = '';
                var flag = 'images/controls/placeholderf.gif';

                for (j = 0; j < tsiteinfo.length; j++) {
                    var thissite = tsiteinfo[j].split('|');
                    if (thissite[0] == markerInfArray[2]) {
                        name = thissite[1];
                        placename = thissite[2];
                        region = thissite[3];
                        if (thissite[4] != '') {
                            summaryimage = thissite[4];
                        }
                        summary = thissite[5];
                        if (thissite[6] != '') {
                            flag = thissite[6];
                        }
                    }
                }

                for (k = 0; k < sitemapperinfo.length; k++) {
                    var thissite = sitemapperinfo[k].split('|');
                    if (thissite[0] == markerInfArray[2]) {
                        url = thissite[1];
                    }
                }

                var markerLatLng = new google.maps.LatLng(markerInfArray[1].toString(), markerInfArray[0].toString());

                var infoWindowContent = '<div class="infowindow">' + markerInfArray[2] + ': ';

                var siteurl = approot + '/sites/' + url;

                infoWindowContent += '<a href="' + siteurl + '" title="' + name + '"><strong>' + name + '</strong></a>';
                infoWindowContent += '<br /><br/><em>' + placename + ', ' +  region + '</em></div>';

                marker = new google.maps.Marker({
                    position: markerLatLng,
                    title: $("<div/>").html(name).text(),
                    shadow: shadow, 
                    icon: image
                });
                addInfo(infoWindow, marker, infoWindowContent);

                markers.push(marker);

                count++;
                if ((count > 20) && ((count % 20) == 1)) { // 20 per page
                    page++;
                    resultHTML += '</ul></div><div id="page' + page + '" class="page"><ul>';
                    paging += '<li><a href="#" title="' + page + '" onclick="togglePaging(\'' + page + '\');return false;">' + page + '</a></li>';
                }

                resultHTML += '<li><div class="namehead"><h2>' + name + ' <span>' + placename + ', ' + region + '</span></h2></div>' +
                    '<div class="codehead"><h2><img alt="' + region + '" src="' + approot +
                    '/' + flag + '" /> ' + markerInfArray[2] + '</h2></div>' +
                    '<div class="resultcontent"><img alt="' + name + '" src="' + approot +
                    '/' + summaryimage +'" />' + '<p>' + summary + '</p>' + document.getElementById('buttonhide').innerHTML.replace('#',siteurl) + '</div></li>';
            }          

            $('#filteredmap .paging').each(function(){
                $(this).html(paging);
            });

            document.getElementById('resultslist').innerHTML = resultHTML + '</ul></div>';
            document.getElementById('count').innerHTML = count + ' ';
            document.getElementById('page1').style.display = 'block';

            for (t = 0; t < markers.length; t++) {
                markers[t].setMap(filteredMap); 
            } 
        });
    }
}

function clearMarkers() {
    for (i = 0; i < markers.length; i++) {
        markers[i].setMap(null); 
        markers[i] = null; 
    } 
    markers.length = 0;
}

然而,当结果数量很高时,我在IE6和7中遇到了性能问题(UI悬挂),但是在任何其他现代浏览器中都没有,即FF,Chrome,Safari等。在创建和添加Google地图标记时更糟糕(如果我删除此部分,它仍然是低迷的,但不是相同程度)。你能说出我出错的地方吗?

提前致谢:)如果可以,请保持温和,我不做很多javascript工作,我对它和jquery很新!

1 个答案:

答案 0 :(得分:1)

无论如何,这在客户端都要做很多工作。

为什么不在服务器上执行此操作,在那里构建所有HTML,只使用ajax查询的结果刷新相关部分?