2012-02-27 5 views
1

페이지 (96 또는 384)에 많은 선택 입력이 있습니다. 각각의 옵션 목록은 약 1000 개입니다. 결과적으로 페이지 크기는 4-8MB (1-4MB 압축)입니다. 옵션 목록을 한 번만 입력하여 페이지를 더 빠르게로드 한 다음 JavaScript로 각 입력에 추가하기로 결정했습니다.많은 수의 요소에 많은 수의 자식을 추가하는 동안 JavaScript 성능

불행히도 브라우저는 작업을 완료하는 데 많은 시간이 필요하거나 FF 10에서 3 분이 걸리거나 Chrome 17이 멈 춥니 다. 나는 jQuery와 pure JS로 작업을 수행하려고 시도했다. 전혀 차이가 없다.

과제가 실행 가능합니까? 빠르고 효율적인 JavaScript를 작성하려면 무엇을 알아야합니까?

Screenshot

편집 : 나는 하나의 문자열로 모든 옵션을 넣어 선택 입력에 넣어 innerHTML을 사용합니다. 이렇게 빠른 응답을 보내 주셔서 감사합니다.

편집 2 : 나는 Diodeus에서 제안한 방식으로 요소를 생성합니다. 그러나 select 요소에 포커스가있을 때 옵션을로드합니다 (thanks rlemon). 나는 모든 대답이 매우 도움이되며 비슷한 문제가있는 사람들에게 가치 있다고 생각합니다. 다들 감사 해요.

+0

아마도 JS 코드를 보여 주어야하기 때문에 살펴볼 수는 있지만 일반적으로 인터페이스를 변경하고 값을 (readonly) 입력 필드에 추가하는 대신 하나의 select를 사용해야합니다. 많은 큰 선택을 가지고있다. – Sirko

+0

어쩌면 당신은 당신의 입력을 onfocus 옵션 목록을로드시켜야 할 것입니다. 이런 식으로 각 입력은 * 로딩하는데 다소 시간이 걸리지 만 전반적인 페이지는 빠르지 않을 것입니다. – rlemon

+0

또 다른 좋은 점. 레몽에게 고마워. – Jacek

답변

4

HTML을 문자열 또는 단일 개체로 구성하여 한 번에 그 페이지에 모두 삽입하십시오. 각 삽입에 대해 문서 재 흐름을 계산해야하기 때문에 DOM 재 작성이 느립니다.

+0

좋은 지적. 나는이 접근법을 시도 할 것이다. – Jacek

+1

이 작업은 [documentFragment] (https://developer.mozilla.org/en/DOM/DocumentFragment)를 사용하여 수행 할 수도 있습니다. 문서 단편은 요소를 DOM 요소처럼 저장하고 작업 할 수 있지만 리플 로우를 유발하지는 않습니다. 트리를 구축하고 나면 DOM에 DF를 간단히 추가 할 수 있습니다. – rlemon

+0

배열과'push() '를 사용하여 모든 문자열을 사용하면 부작용이있는 오래된 브라우저 (특히 IE <9)에 큰 변화가 있습니다. – ckozl

1

왜 아이들을 별도로 추가해야합니까? 전체 목록을 다른 요소의 옵션으로 감싸고 해당 요소를 추가하기 만하면됩니다. 이것은 단지 1000 대신 하나의 연산이 될 것이기 때문에 훨씬 빨라야합니다.

+0

모든 옵션을 단일 문자열에 넣고 innerHTML을 사용하여 선택 입력에 넣습니다. 나는 내 게시물에 그것을 말 했어야했다. 어쨌든, 빠른 답변 주셔서 감사합니다 :). – Jacek

1

아약스 사용을 제안합니다. 타사 콤보 상자로 표준 입력 선택 바꾸기 예 : Jquery UI Combobox 먼저 모든 빈 콤보 박스를로드합니다. 항목을 클릭하면 드롭 다운 목록이 열리는 즉시로드됩니다.

jquery 및 jquery UI를 사용하면 매우 쉽게 작업을 수행 할 수 있습니다.

1

JS를 사용하여 수천 개의 요소를 추가하는 것보다 HTML에 기본적으로 모든 것을로드하는 것이 더 빠릅니다.

귀하의 서버는 귀하에게 귀하의 컴퓨터가 제공하지 않는 품질/속도의 보장을 귀하에게 제공합니다.

+0

4-5MB를 다운로드 할 것입니다. 어느 쪽이든 적절한 해결책은 사용자의 포커스에 따라 옵션을 동적으로로드하는 것입니다. – rlemon