Javascript Висячий интерфейс на IE6 / 7 - PullRequest
2 голосов
/ 26 апреля 2011

Может кто-нибудь предложить улучшения производительности для функции, которую я написал (ниже, javascript с битами jquery)? Или указать какие-либо явные, основные недостатки? По сути, у меня есть карта Google на javascript и набор результатов, основанных на списках, и функция вызывается щелчком флажка, который просматривает выбор флажков (каждый из которых идентифицирует «фильтр») и соответствующим образом сокращает данные массива, изменяя DOM и обновление маркеров карты Google в соответствии с этим. Там также есть «фальшивый» образ загрузчика в момент задержки, так что он анимируется до зависания интерфейса!

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, когда число результатов велико, но не в любых других современных браузерах, например, FF, Chrome, Safari и т. Д. Это намного хуже, когда маркеры карты Google создаются и добавляются (если я удаляю эту часть, она все еще медленная, но не до такой же степени). Можете ли вы подсказать, где я ошибаюсь?

Заранее спасибо :) Пожалуйста, будьте осторожны, если можете, я не делаю много работы с javascript, и я довольно новичок в этом и jquery!

1 Ответ

1 голос
/ 26 апреля 2011

Это выглядит как большая работа для клиента, несмотря ни на что.

Почему бы вам не сделать это на сервере, а создать там весь HTML-код и просто обновить соответствующие разделы результатами ajax-запроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...