피해야 할 jQuery 함정


210

jQuery로 프로젝트를 시작하고 있습니다.

jQuery 프로젝트에 어떤 함정 / 오류 / 오해 / 부정 / 오용이 있습니까?


4
이것은 "건설적이지 않다"는 이유로 폐쇄 되어서는 안됩니다 . 매우 유용한 답변이 구체화되었으며이 질문에 220 번의 별표가 표시되었습니다. 업장이 충분하면 다시 열어 투표 해주세요.
Roy Prins

나에게 보인다, jQuery는 그 자체로 함정이다
gromit190

답변:


189

성능 저하를 인식하지 못하고 선택기를 로컬 변수에 할당하는 대신 셀렉터를 과도하게 사용합니다. 예를 들면 다음과 같습니다.

$('#button').click(function() {
    $('#label').method();
    $('#label').method2();
    $('#label').css('background-color', 'red');
});

오히려 :-

$('#button').click(function() {
    var $label = $('#label');
    $label.method();
    $label.method2();
    $label.css('background-color', 'red');
});

또는 더 나은 체인으로 :-

$('#button').click(function() {
    $("#label").method().method2().css("background-color", "red"); 
});

내가 찾은 내가 어떻게 호출 스택 작업을 깨달았을 때 계몽 순간을.

편집 : 의견에 제안을 통합했습니다.


16
YouTube 링크의 경우 +1 거룩한 쓰레기 나는 많은 것을 배웠다.
Jason

23
로컬 변수에 할당하는 것이 훌륭하지만 체인의 힘 (예제에서)을 잊지 마십시오. $ ( "# label"). method (). method2 (). css ( "background-color", " 빨간");
랜스 맥 니니

YouTube 비디오는 훌륭했습니다. 주제에 대한 다른 Google 프리젠 테이션을 보았지만 여전히 몇 가지 사항을 배웠습니다! 감사!
Gabriel Hurley

링크도 +1, 훌륭합니다!
Josh Stodola

7
jQuery 컨텍스트가있는 변수에 달러 기호를 사용하는 것은 일종의 규칙입니다. 당신은 쓰기 싶어 할 수 있도록var $label = $('#label');
팀 쎄

90

컨텍스트 사용 방법을 이해하십시오. 일반적으로 jQuery 선택기는 전체 문서를 검색합니다.

// This will search whole doc for elements with class myClass
$('.myClass');

그러나 컨텍스트 내에서 검색하여 작업 속도를 높일 수 있습니다.

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);

9
아아 아아아! 글쎄, 내 버그 중 약 1,000,000 개가 수정되었습니다. +1
jammus

4
마지막 요점이 잘못된 것 같습니다 -groups.google.co.uk/group/jquery-dev/browse_thread/thread/…
James

1
JP를 지적 해 주셔서 감사합니다. 이제, 무엇을해야합니까 ... 아무도 대답을 삭제하여 다른 사람을 사귀지 않고 코드를 변경하지 않도록해야합니까?
slolife

아냐, 그것은 여전히 ​​최적화 측면에서 좋은 지적입니다. :)
James

2
jQuery는 컨텍스트가 jQuery의 불안정한 지 확인하므로 이유가 없습니다 [0]. $('.myClass', ct);당신이 알고있는 경우 또는 CT를 사용할 수있는 jQuery를의 인스턴스 찾으십시오ct.find(".myClass")
gradbot

62

다음과 같이 베어 클래스 선택기를 사용하지 마십시오.

$('.button').click(function() { /* do something */ });

그러면 모든 단일 요소를 살펴보고 "button"클래스가 있는지 확인합니다.

대신 다음과 같이 도움을 줄 수 있습니다.

$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });

작년에 Rebecca Murphy의 블로그 에서 배웠습니다.

업데이트 -이 답변은 2 년 전에 제공되었으며 현재 버전의 jQuery에 적합하지 않습니다 . 의견 중 하나에는이를 증명하는 테스트가 포함됩니다. 이 답변 당시 jQuery 버전을 포함 하는 업데이트 된 테스트 버전 도 있습니다 .


6
나는 또한 그 반대가 사실이라는 인상을 받았다. 아마도 이것은 getElementsByClassName을 구현하지 않는 브라우저의 경우이지만 jQuery에 더 많은 작업을 제공합니다. 나는 것 매우 레베카는 일부 벤치 마크 : 게시보고 싶다
알렉스 바렛

7
해야 할 일의 양을 줄입니다. 다른 사람에게 양말을 방에서 꺼내라고 말하는 대신 옷장에있는 서랍에서 양말을 꺼내라고 말하는 것과 같습니다. 실질적으로해야하는 '보는'양을 줄입니다.
Sneakyness

4
CSS를 작성할 때 (요소 태그를 포함하여) 반대의 경우도 마찬가지입니다. code.google.com/speed/page-speed/docs/…
kmiyashiro 23.13의

7
@Sneakyness 모든 것이 실생활의 정확한 아날로그를 가지고있는 것은 아닙니다. 예를 들어, 브라우저에서 지원 $('.b')하는 document.getElementsByClassName('b')경우 사용할 수 있지만 그렇게 $('a.b')하면 클래스 b와 일치하는 모든 요소를 가져온 다음 2 단계 작업에서 앵커인지 확인합니다. 후자는 나에게 더 많은 일처럼 들린다. 실제 비유를 위해 이것을 시도하십시오 : 내 방에있는 모든 양말을 찾으십시오. 이제 내 옷장에없는 것들을 버리십시오.
alex

2
선택기에 대한 오해는 이전 버전의 jquery에서 정의에 따르면 id가 고유하기 때문에 $ ( 'div # foo') 대신 $ ( '# foo')를 수행하는 것이 더 빠르기 때문이라고 생각합니다. 나는 확신이 그러나 이후 릴리스에서 수정되었습니다하지만,이 권고는 선택기의 식별자로,되지 않은 다른 유형의 적용
알렉스 HEYD을

35

익명 함수를 분리하여 재사용 할 수 있도록하십시오.

//Avoid
$('#div').click( function(){
   //do something
});

//Do do
function divClickFn (){
   //do something    
}

$('#div').click( divClickFn );

19
나는 이것이 동기 (인라인) 코드가 명명 된 함수로 나뉘어 야하는 정도와 거의 동일하게 적용된다고 생각합니다. 이름을달라고 구걸하는 코드 덩어리가 있다면 그것을 찾으십시오. 그러나 단순히 코드를 함수 안에 넣었 기 때문에 코드를 행 밖으로 옮기지 마십시오. 정당한 이유로 익명 함수가 존재합니다.
Dan Breslau

4
실제로 나는 내 기능에 '이름'을 부여하고 싶습니다. 코드를 디버깅 할 때 익명 함수의 끝없는 목록을 보는 대신 이름이 올바르게 지정된 함수를 볼 때 매우 유용합니다.
SolutionYogi

1
당신의 요점은 잘 잡히고, 나는 아마 이것에 의해 몇 번 걸려 넘어 졌을 것입니다. 그럼에도 불구하고 " 거의 같은 정도"는 여전히 저에게 효과적입니다.
Dan Breslau

1
esp. 바인딩이 루프에서 발생하는 경우!
daniellmb

명명 된 함수는 디버깅 할 때 큰 이점을 제공합니다. 아무것도없는 8 단계 깊이의 콜 스택을 보는 것보다 더 큰 것은 없습니다 (anonymous). 이 팁에 대한 자세한 내용은 여기를 참조하십시오 : stackoverflow.com/questions/182630/jquery-tips-and-tricks/…
ken Ken

34
  • 문서를 남용하지 마십시오.
  • 문서를 초기화 코드로만 준비하십시오.
  • 항상 재사용 가능한 문서 외부에서 함수를 추출하십시오.

doc ready 문에서 수백 줄의 코드를 보았습니다. 추악하고 읽을 수 없으며 유지 관리가 불가능합니다.


6
+1. 일반적으로 내가 본 대부분의 jQuery 코드는 수백 줄의 함수를 사용합니다. 'jQuery 개발자'가 더 작은 기능을 사용하지 않는 이유를 모르겠습니다.
SolutionYogi

6
@SolutionYogi 대부분은 JS 멍청한 놈이기 때문에?
adamJLev

나는 문서 준비에 매우 긴 기능을 넣지 않기 위해 최선을 다하고 있습니다. 좋은 조언입니다. 그러나 문서 준비 상태가 아닌 중요한 기능에서 실행되는 많은 작은 구성 요소 기능을 만드는 것이 반드시 최선의 방법은 아닙니다. 중요한 함수가 그러한 코드 조각을 사용하는 유일한 함수라면 읽기가 더 어려워도 하나의 함수에 모두 넣는 것이 좋습니다. 함수 호출에는 많은 오버 헤드가 있으며 한 컨텍스트에서만 코드를 사용하는 경우 피해야합니다.
sage88

34

서버에 $.ajax대한 Ajax 요청에 대한 기능을 사용하는 동안 complete이벤트를 사용하여 응답 데이터를 처리 하지 않아야 합니다. 요청이 성공했는지 여부를 나타냅니다.

대신을 complete사용하십시오 success.

문서에서 Ajax Events 를 참조하십시오 .


1
나는 성공과 완전에 관해 앞뒤로왔다 갔다. 왜 완전이 더 낫다고 생각하는지 확장 할 수 있는가?
Neil N

1
나는 완전한 것이 더 좋다고 말하지 않습니다. 내가 말하려고하는 것은 당신이 완전하게 오도 된 사용을 피해야하며 응답 데이터를 처리하기 위해 성공을 사용해야한다는 것입니다.
Artem Barger

2
글쎄 항상 호출됩니다. 그러나 나는 동의하지 않을 것이다. 완료는로드 gif 등을 숨기는 데 가장 좋습니다. 응답 처리에 성공하고 물론 오류에 대한 오류를 사용해야합니다.
redsquare

1
그는 완전 함 대신 성공을 제안하고있다. '완료'는 아약스 요청이 '완료'인 경우 항상 발생하며, 성공적으로 완료되었거나 실패한 경우에는 중요하지 않습니다.
SolutionYogi

@redsquare, 당신이 정확히 동의하지 않는 것을 확장 할 수 있습니까? 나는 데이터 프로세스를 언급하고 있었고 완전한 핸들러로 가질 수있는 기회를 숨기거나 보여주는 그림은 신경 쓰지 않았습니다.
Artem Barger

24

"Chaining"콜백이있는 애니메이션 이벤트.

클릭하면 사라지는 단락에 애니메이션을 적용하려고한다고 가정합니다. 나중에 DOM에서 요소를 제거하려고했습니다. 메소드를 간단히 연결할 수 있다고 생각할 수도 있습니다.

$("p").click(function(e) {
  $(this).fadeOut("slow").remove();
});

이 예제에서 .remove ()는 .fadeOut ()이 완료되기 전에 호출되어 점진적인 페이딩 효과를 없애고 요소를 즉시 사라지게합니다. 대신 이전을 마친 후에 만 ​​명령을 실행하려면 콜백을 사용하십시오.

$("p").click(function(e){
  $(this).fadeOut("slow", function(){
    $(this).remove();
  });
});

.fadeOut ()의 두 번째 매개 변수는 .fadeOut () 애니메이션이 완료되면 실행되는 익명 함수입니다. 이것은 점진적인 페이딩과 요소의 후속 제거를 만듭니다.


24

동일한 이벤트를 여러 번 bind ()하면 여러 번 발생합니다. 나는 보통 항상 unbind('click').bind('click')안전 하러갑니다


2
이것은 명심해야 할 중요한 사항이지만 jQuery에만 국한된 것은 아닙니다.
SolutionYogi

11
라이브 이벤트를 사용하여 동일한 이벤트를 두 번 바인딩하지 않아도됩니다.
Powerlord

live는 초과 사용하는 경우 자체 (성능) 문제가 있습니다. 컨텍스트를 제공 할 수있는 1.3.3에서 더 좋습니다.
redsquare

23

플러그인을 남용하지 마십시오.

대부분의 경우 라이브러리와 사용자 인터페이스 만 있으면됩니다. 간단하게 유지하면 장기적으로 코드를 유지 관리 할 수 ​​있습니다. 모든 플러그인이 지원 및 유지 보수되는 것은 아니며 실제로 대부분은 그렇지 않습니다. 핵심 요소를 사용하여 기능을 모방 할 수 있다면 강력히 권장합니다.

플러그인은 코드에 쉽게 삽입하여 시간을 절약 할 수 있지만 추가 항목이 필요할 경우 업데이트를 잃을 수 있으므로 수정하지 않는 것이 좋습니다. 시작할 때 저장하는 시간은 나중에 더 이상 사용되지 않는 플러그인 변경에서 느슨해집니다.

현명하게 사용하는 플러그인을 선택하십시오. 라이브러리 및 사용자 인터페이스 외에도 지속적으로 $ .cookie , $ .form , $ .validatethickbox를 사용 합니다. 나머지 부분에서는 주로 자체 플러그인을 개발합니다.


2
그리드는 어떻습니까? 당신은 당신의 자신을 만들?
jmav

예. 프로젝트에서 프로젝트 데이터까지 다양한 방식으로 제공됩니다. 나는 그 그리드를 실현하는 것이 나에게 중간에 도움이되고 즉흥적으로해야한다는 것을 완전히 통제하는 것을 선호합니다.
Elzo Valugi

충분한 시간이 주어진다면, 일반적으로 모든 데이터 주도형 조작 (css / html) 코드를 직접 작성하는 것을 선호합니다. 즉, '플러그인'에 데이터를 전달하지 말고 html을 뿌립니다. 현재 범위 호환성을 위해 (미드 필드) 플러그인을 평가할 수있을만큼 미래의 요구를 잊어 버리십시오. 디자이너, 기획자, 관리자, 관리자, 관리자. 아, 그리고 클라이언트와 사용자. 그러나 당신이 그 모든 것을 가지고 있다면, 당신은 충분한 '시간'을 갖지 못할 것입니다. 이미 jqgrid를 사용하십시오-심의하는 시간을 낭비하고 있습니다. 아직 완료 되었습니까?}
user406905

22

함정 : 선택기 대신 루프 사용.

DOM 요소를 반복하기 위해 jQuery '.each'메소드에 도달하는 경우 선택기를 사용하여 요소를 대신 사용할 수 있는지 스스로에게 물어보십시오.

jQuery 선택기에 대한 자세한 정보 :
http://docs.jquery.com/Selectors

함정 : Firebug와 같은 도구를 사용하지 않음

Firebug는 실제로 이런 종류의 디버깅을 위해 만들어졌습니다. Javascript를 사용하여 DOM에서 문제를 해결하려면 가시성을 제공하기 위해 Firebug와 같은 훌륭한 도구가 필요합니다.

Firebug에 대한 추가 정보 : http://getfirebug.com/

: 다른 좋은 아이디어는 다형성 팟 캐스트의 에피소드에 (데이브 워드와 jQuery를 비밀) http://polymorphicpodcast.com/shows/jquery/


1
나는 처음 한 번을 여러 번했습니다. 대부분의 jQuery 함수는 선택기에서 반환 된 모든 요소에서 작동한다는 것을 기억하면됩니다.
DisgruntledGoat

.each 방법을 정직하게 싫어함
Simon Hayter

14

올바른 컨텍스트에서이 식별자를 사용하는 것에 대한 오해. 예를 들어 :

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   $(".listOfElements").each( function()
   {
      $(this).someMethod( ); // here 'this' is not referring first_element anymore.
   })
});

그리고 여기 당신이 그것을 해결할 수있는 샘플 중 하나가 있습니다 :

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   var $that = this;
   $(".listOfElements").each( function()
   {
      $that.someMethod( ); // here 'that' is referring to first_element still.
   })
});

1
+1 jquery 문제보다 자바 스크립트 문제가 더 많았지만이 문제로 많이 넘어졌습니다.
mmacaulay

13

전체 DOM을 여러 번 검색하지 마십시오. 이것은 실제로 스크립트를 지연시킬 수있는 것입니다.

나쁜:

$(".aclass").this();
$(".aclass").that();
...

좋은:

$(".aclass").this().that();

나쁜:

$("#form .text").this();
$("#form .int").that();
$("#form .choice").method();

좋은:

$("#form")
    .find(".text").this().end()
    .find(".int").that().end()
    .find(".choice").method();

2
$ ( ". aclass"). this (). that (); 좋지 않다! 클래스 만 선택자는 느린
redsquare

하나의 선택에 여러 메소드를 사용할 수있는 Jquery의 기능을 보여주는 예제입니다. 이 기술에 더 집중하기 위해 선택을 간단하게 (그리고 느리게) 만들었습니다.
googletorp

10
DOM을 반복적으로 검색하지 않는 것이 좋습니다. 마지막 예제는 무슨 일이 일어나고 있는지 전혀 모르는 읽을 수없는 혼란입니다. 페치 결과를 여러 번 사용하려는 경우 변수에 저장하십시오. 코드를 유지 관리하기가 훨씬 쉽습니다.
Quentin

12

항상 .each ()에서 $ (this)를 의미있는 변수에 캐시하십시오.

이렇게

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})

12
좋은 변수 이름을 생각하기에 너무 게으른 경우 $self또는 사용하십시오 $this.
gradbot

10

Repo Man이 말한 것과 비슷하지만, 그렇지는 않습니다.

ASP.NET Winforms를 개발할 때 종종

$('<%= Label1.ClientID %>');

# 기호를 잊어 버렸습니다. 올바른 형태는

$('#<%= Label1.ClientID %>');

10

행사

$("selector").html($("another-selector").html());

이벤트를 복제하지 않습니다. 모든 이벤트를 리 바인드해야합니다.

JP 명령에 따라 -clone ()은 true를 전달하면 이벤트를 리 바인드합니다.


4
Clone ()은 true를 전달하면 수행합니다.
제임스

jQuery 1.3.2의 live ()는 어떻습니까?
jmav

9

동일한 jQuery 객체를 여러 번 만들지 마십시오.

//Avoid
function someFunc(){
   $(this).fadeIn();
   $(this).fadeIn();
}

//Cache the obj
function someFunc(){
   var $this = $(this).fadeIn();
   $this.fadeIn();
}

var $ this = $ (this) .fadeIn () ;? 효과를 캐싱하고 있습니까?
Jason

12
체인을 호출하는 요소를 반환합니다!
redsquare

변수를 설정하고 동시에 조치를 수행 할 수 있습니까?
Jason

1
실제로, 그러나 그것에 대한 내 말을하지 마십시오. 시도 해봐. 요소를 나타내는 jquery 객체가 반환되지 않으면 다음이 어떻게 가능하다고 생각합니까? $ ( '# divId'). hide (). show (). fadeIn () .... etc
redsquare

14
그것은 효과가 있지만 $this = $(this);별도의 줄에있는 것이 더 읽기 쉽다고 생각합니다 . 당신이 할 수 있다면 (엉망이없이) $this모든 것을 잊고 $(this).fadeIn().fadeIn();
묶어 놓으십시오

8

JavaScript도 마찬가지이지만 jQuery, JavaScript는 절대 CSS를 대체해서는 안됩니다.

또한 JavaScript를 사용하지 않는 사람이 사이트를 사용할 수 있는지 확인하십시오 (오늘날의 관련성이 높지 않지만 항상 완전히 사용 가능한 사이트를 갖는 것이 좋습니다).


6

너무 많은 DOM 조작. 브라우저가 페이지를 렌더링하고 다시 렌더링하는 방식으로 인해 .html (), .append (), .prepend () 등의 메서드는 훌륭하지만 너무 자주 사용하면 속도가 느려질 수 있습니다. DOM을 여러 번 변경하는 대신 html을 문자열로 작성하여 DOM에 한 번 포함하는 것이 더 좋습니다.

대신에:

var $parent = $('#parent');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $parent.append($div);
}

이 시도:

var $parent = $('#parent');
var iterations = 10;
var html = '';

for (var i = 0; i < iterations; i++){
    html += '<div class="foo-' + i + '"></div>';
}

$parent.append(html);

또는 이것조차도 ($ wrapper는 DOM에 아직 주입되지 않은 새로 생성 된 요소입니다.이 래퍼 div에 노드를 추가해도 속도가 느려지지 않으며 결국 하나의 DOM 조작을 사용하여 $ parent에 $ wrapper를 추가합니다 ) :

var $parent = $('#parent');
var $wrapper = $('<div class="wrapper" />');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $wrapper.append($div);
}

$parent.append($wrapper);

+1 ... 매초 여러 요소에 .html ()을 사용하고 있습니다. 그것이 모든 것을 느리게 시작한다는 것을 알았습니다!
사용자 2

5

ClientID를 사용하여 ASP.NET 프로젝트에서 컨트롤의 "실제"ID를 가져옵니다.

jQuery('#<%=myLabel.ClientID%>');

또한 SharePoint 내에서 jQuery를 사용하는 경우 jQuery.noConflict ()를 호출해야합니다.


11
? 함정은 어떻습니까? ASP.NET 동작에 대한 해결 방법입니다.
SolutionYogi

1
네. jQuery 문제가 아닙니다. asp.net webforms의 결함입니다.
redsquare

3
동의했다. 그러나 이것은 ASP.NET에서 jQuery를 사용할 때 알아야 할 사항입니다.
Jacobs Data Solutions

2
영업 이익은 asp.net 언급하지 않았다
redsquare에게

4

jQuery 객체 대신 ID를 함수에 전달 :

myFunc = function(id) { // wrong!
    var selector = $("#" + id);
    selector.doStuff();
}

myFunc("someId");

랩핑 된 세트를 전달하는 것이 훨씬 더 유연합니다.

myFunc = function(elements) {
    elements.doStuff();
}

myFunc($("#someId")); // or myFunc($(".someClass")); etc.

3

체인을 과도하게 사용합니다.

이것 좀 봐:

this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);

설명


1
우스운 것처럼 보이죠, 그것은 난독 화의 일종입니다.
Dykam

6
체인 자체 (자체)는 '과잉'으로 사용하기가 어렵습니다. 그 코드는 자바 스크립트 삼항 연산자를 과도하게 사용하는 것처럼 보입니다. 자세한 내용은 en.wikipedia.org/wiki/Ternary_operation#JavaScript 를 참조하십시오.
Dan Esparza

3
코드를 유지할 필요가 없어서 다행입니다.
cdmckay

3

문자열 누산기 스타일 사용

+ 연산자를 사용하면 새로운 문자열이 메모리에 생성되고 연결된 값이 할당됩니다. 이 후에 만 ​​결과가 변수에 지정됩니다. 연결 결과에 대한 중간 변수를 피하기 위해 + = 연산자를 사용하여 결과를 직접 지정할 수 있습니다. 느린:

a += 'x' + 'y';

더 빠름 :

a += 'x';
a += 'y';

기본 작업은 함수 호출보다 빠를 수 있습니다

성능 결정 루프 및 함수에서 함수 호출에 대한 대체 기본 오퍼레이션 사용을 고려하십시오. 느린:

var min = Math.min(a, b);
arr.push(val);

더 빠름 :

var min = a < b ? a : b;
arr[arr.length] = val;

JavaScript 성능 모범 사례 에서 자세히 알아보기


1

사용자가 브라우저에서 html 엔티티를 볼 수있게하려면 'text'대신 'html'을 사용하여 다음과 같은 유니 코드 문자열을 삽입하십시오.

$('p').html("Your Unicode string")

1

내 두 센트)

일반적으로 jquery를 사용하면 실제로 DOM 요소에 대해 걱정할 필요가 없습니다. 다음과 같이 작성할 수 있습니다.-- $('div.mine').addClass('someClass').bind('click', function(){alert('lalala')})이 코드는 오류없이 실행됩니다.

어떤 경우에는 이것이 유용하지만 어떤 경우에는 전혀 유용하지 않지만 jquery는 비어있는 일치하는 경향이 있다는 사실입니다. 아직,replaceWith 문서에 속하지 않은 요소와 함께 사용하려고하면 오류가 발생합니다. 나는 오히려 반 직관적이라는 것을 알았습니다.

또 다른 함정은 prevAll () 메소드가 반환 한 노드의 순서입니다 $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll(). 실제로 큰 문제는 아니지만이 사실을 명심해야합니다.


0

예를 들어 20 개의 열이있는 1500 개의 테이블 행과 같은 많은 데이터에서 Ajax를 계획하고 있다면 jQuery를 사용하여 해당 데이터를 HTML에 삽입 할 생각조차하지 않아도됩니다. 일반 JavaScript를 사용하십시오. 느린 컴퓨터에서는 jQuery가 너무 느립니다.

또한 jQuery는 들어오는 HTML에서 스크립트 태그를 구문 분석하고 브라우저 문제를 처리하는 것과 같이 느리게 만드는 작업을 수행합니다. 빠른 삽입 속도를 원하면 일반 JavaScript를 사용하십시오.


1
-1 .html () 함수는 네이티브 접근 방식만큼 빠릅니다.
cllpse

나를 downvoting하고있는 모든 사람들은 IE에 많은 DOM을 삽입하려고 시도하고 일이 느려지는 것을 지켜 보았습니다. jquery가 느린 이유는 단순히 dom을 삽입하지 않을 것입니다 .dom에 스크립트가 있는지 확인하고 IE에서 스크립트를 실행하는지 확인하고, 정확히 알고 있으면 수행하지 않아도되는 다른 것들과 같은 몇 가지 다른 작업을 수행합니다. 어떤 종류의 데이터 삽입
mkoryak

1
브라우저 누출 등에 대해 걱정할 필요 .innerHTML가 없다면 그렇게 할 것입니다. 그러나 사용자가 탭을 몇 시간 동안 열어 둔 Gmail과 같은 것을 구축하는 경우 총알을 물고 여분의 속도 저하를 처리해야합니다. 궁금한 점이 있으시면 jQuery의 정확한 기능 .html()은 다음과 같습니다. james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
adamJLev

-1

작은 프로젝트에서 jQuery를 사용하여 일반 자바 스크립트 몇 줄만으로 완료 할 수 있습니다.


나는 무너지지 않지만 당신의 선택을 주장하십시오.
vise

8
-1 jQuery는 깨진 API를 추상화합니다. 이렇게하면 항상 코드가 작동하고 있는지 확인할 수 있습니다. jQuery를 사용하여 일부 코드를 작성했고 일부 임의의 브라우저 버그가 새 버전으로 도입되었다고 가정하면 업데이트 된 버전의 jQuery 프레임 워크를 가져 오기만하면됩니다. 버그를 직접 해결하는 방법을 알아 내야합니다.
cllpse

+1은 나에게 합리적 인 것 같습니다. 몇 줄만 사용하는 경우 바닐라 JS를 사용하는 것이 좋습니다.
alex

1
@roosteronacid, 당신의 주장은 요점을 놓칩니다. 브라우저가 덜 복잡한 스크립트에서 회귀를 도입하거나 해당 문제에 대한 크로스 브라우저 문제를 처리하는 것은 거의 불가능합니다. 2 년 전 mootools로 작업했으며 특정 상황에서 IE의 요소 내용을 읽을 수 없었습니다. 문제를 파악하기 위해 몇 시간을 보낸 후에 나는 그 부분을 일반 js로 다시 작성했습니다. 따라서 브라우저 업그레이드로 인해 일반 자바 스크립트가 아닌 jQuery가 중단 될 가능성이 높습니다. 라이브러리 코드를 해킹하는 대신 하루 종일 버그를 해결했습니다.
vis

3
couple of lines of ordinary JavaScript문제 없습니다. 그러나 언제 그랬습니까? "바닐라 자바 ​​스크립트를 사용하지 않는 이유 ??" 아직 IE에 의해 충분히 물린 적이 없었습니다 ... 그리고 평범한 오래된 JS에서 간단한 일을하기 위해 얼마나 많은 cruft 및 상용구 코드를 작성 해야하는지 언급하지 않았습니다.
adamJLev

-3

이벤트 바인딩을 이해하지 못합니다. JavaScript와 jQuery는 다르게 작동합니다.

대중적인 수요에 의한 예 :

jQuery에서 :

$("#someLink").click(function(){//do something});

jQuery없이 :

<a id="someLink" href="page.html" onClick="SomeClickFunction(this)">Link</a>
<script type="text/javascript">
SomeClickFunction(item){
    //do something
}
</script>

기본적으로 JavaScript에 필요한 후크는 더 이상 필요하지 않습니다. 즉, 인라인 마크 업 (onClick 등)을 사용하면 개발자가 일반적으로 CSS 목적으로 활용하는 ID 및 클래스를 간단히 사용할 수 있기 때문입니다.


5
정교하게 관리? 가급적 예?
SolutionYogi

7
JavaScript가 addEventListener () 및 attachEvent ()를 제공하지 않습니까?
alex

2
우려의 분리. HTML과 JS를 별도로 유지하십시오
Don
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.