여러 $ (document) .ready (function () {…});를 가질 수 있습니다. 섹션?


240

시작시 많은 기능을 가지고 있다면 모두 하나의 단일 상태에 있어야합니다.

$(document).ready(function() {

또는 여러 진술을 할 수 있습니까?


1
각각 $ (document) .ready ()를 포함하는 여러 개의 js 파일을로드해야 할 때 주로 필요합니다. 기능
Abdillah

@leora이 질문은 인터뷰에서 질문을 받았다 : D 감사
eirenaios

답변:


288

여러 개를 가질 수 있지만 항상 가장 쉬운 것은 아닙니다. 가독성에 심각한 영향을 미치므로 남용하지 마십시오. 그 외에는 완벽하게 합법적입니다. 아래를보십시오 :

http://www.learningjquery.com/2006/09/multiple-document-ready

이것을 시도하십시오 :

$(document).ready(function() {
    alert('Hello Tom!');
});

$(document).ready(function() {
    alert('Hello Jeff!');
});

$(document).ready(function() {
    alert('Hello Dexter!');
});

이것과 동등한 것을 알 수 있습니다. 실행 순서에 유의하십시오.

$(document).ready(function() {
    alert('Hello Tom!');
    alert('Hello Jeff!');
    alert('Hello Dexter!');
});

$(document).ready블록 내에 정의 된 함수 를 다른 $(document).ready블록 에서 호출 할 수 없다는 점도 주목할 가치가 있습니다 .

$(document).ready(function() {
    alert('hello1');
    function saySomething() {
        alert('something');
    }
    saySomething();

});
$(document).ready(function() {
    alert('hello2');
    saySomething();
}); 

출력은 다음과 같습니다

hello1
something
hello2

25
여러 $ (document) .ready () 문을 사용할 때 실행 순서에 의존하는 것은 현명하지 않습니다. 각각은 이미 실행되었거나 실행되지 않은 다른 것과 독립적으로 실행해야합니다.
James

@AoP-순서대로 실행되지 않으면 응용 프로그램의 맥락에서 완전히 의미가 없으므로 여러 $ (document) .ready (블록을 ​​사용하면 완전히 손상됩니다.
karim79 '

7
@ karim79 확실히이 (OP의 질문)는 여러 시작 문제가있는 복잡한 코드를 작성할 때 가장 적합합니다. 즉 로드가 완료 될 때 항상 실행 되는 코드 와 일부 콘텐츠 노드에만 필요한 코드가 있습니까? 이러한 상황에서는 컨텍스트가 사일로 화되어야하고 실행 순서가 중요하지 않아야합니다. 즉, 이전 이벤트를 덮어 쓰지 않고 'DOM 준비'이벤트에 할당 할 수 있으면 순서 동작에 관계없이 유용한 기능이됩니다.
tehwalrus

1
하나의 준비 블록에 정의 된 함수에 대해서는 다른 준비 블록에서 호출 할 수 없습니다. 이것은 함수를 정의하는 방식에 해당하지만, 대신 saySomething = function () {}로 정의하면 호출 할 수 있습니다. 이상한가요? jsfiddle.net/f56qsogm 여기서 테스트하십시오.
무비 철

2
전역 적으로 액세스 할 수있는 창 객체에 함수를 추가하기 때문에 이와 같이 작동한다고 생각합니다. 그렇지 않으면 해당 준비 기능에 대해 로컬로 범위가 지정된 선언적 기능입니다.
무비 철

19

여러 개를 사용할 수 있습니다. 그러나 하나의 문서에서 여러 기능을 사용할 수도 있습니다.

$(document).ready(function() {
    // Jquery
    $('.hide').hide();
    $('.test').each(function() {
       $(this).fadeIn();
    });

    // Reqular JS
    function test(word) {
       alert(word);
    }
    test('hello!');
});

페이지에 첨부 된 코드를 완전히 제어 할 수 있으면 괜찮습니다. 누군가가 이미 페이지에 첨부 된 다른 파일로이 파일을 작성했다면 다음과 같이 선언해도됩니다.
James Wiseman

무슨 말을하는지 잘 모르겠습니다. 그러나 이것을 머리 속에 넣고 15 개의 다른 외부 JS를 포함하면 모든 것이 하나 또는 여러 개의 document.load를 포함하지만 여전히 하나만있는 것처럼 작동합니다. 각 함수 / 변수의 특종은 $ (document) .ready-function의 닫는 대괄호로 끝납니다.
Mickel

2
때로는 다른 사람들이 문서 준비 기능이 이미 선언 된 페이지에 모듈을 작성했을 것이므로 모든 코드를 하나의 함수로 옮길 수있는 사치를 얻지 못할 수도 있습니다 (당연히 이상적입니다) ). 그러나 On Ready Bloating을 얻을 수 있으므로 코드를 유지하기가 어렵게 만들 수 있으므로 여기에 너무 많은 자료가 있다는 것에주의해야합니다.
James Wiseman

1
아, 이제 당신을 얻습니다. 네, 동의합니다. 그것이 가능하다는 것을 증명하기 위해 예를
들었습니다

15

예, 여러 블록을 쉽게 가질 수 있습니다. 평가 순서가 예상과 다를 수 있으므로 이들 간의 종속성에주의하십시오.


11

, 여러 $ (document) .ready () 호출이 가능합니다. 그러나 나는 그들이 어떤 방식으로 처형 될지를 알 수 없다고 생각합니다. (출처)


14
추가 된 순서로 호출
redsquare

고마워, 주제에 대한 일반적인 지혜에도 불구하고 jQuery ready () 페이지 는 실제로 글을 쓸 수 있는지 여부를 말하지 않기 때문에 명확하게하는 것이 좋습니다 . 그것은 그러나 가지 않는 의미 당신이 한 문장의 행간을 읽는다면, 그것의 확인을 :Ready handlers bound this way are executed after any bound by the other three methods above.
등록 편집


3

예, 완벽하게 괜찮습니다.하지만 이유없이하지 마십시오. 예를 들어 자바 스크립트 파일이 동적으로 생성 될 때 개별 페이지와 별도로 전역 사이트 규칙을 선언하는 데 사용했지만 계속 반복해서 읽으면 읽기가 어렵습니다.

또한 다른 jQuery(function(){});호출 에서 일부 메소드에 액세스 할 수 없으므로 그렇게하고 싶지 않은 또 다른 이유입니다.

이전 window.onload기능을 사용하면 함수를 지정할 때마다 이전 기능을 대체합니다.


2

그래 넌 할수있어.

여러 문서 준비 섹션은 다른 모듈을 사용하는 동일한 페이지를 다른 모듈로 가져 오는 경우 특히 유용합니다. 이전 window.onload=func선언에서는 호출 할 함수를 지정할 때마다 이전 함수를 대체했습니다.

이제 지정된 모든 기능이 지정된 문서 준비 섹션에 관계없이 대기 / 스택됩니다 (누군가를 확인할 수 있습니까?).


예, 함수가 이전 $ (document) .ready 함수를 대체하는 것보다 평가자가 대기합니다.
Deeksy

2

더 좋은 방법은 스위치를 명명 된 기능으로 전환하는 것입니다 (해당 주제에 대한 자세한 내용은 오버플로 확인) . 그렇게하면 단일 이벤트에서 전화를 걸 수 있습니다.

이렇게 :

function firstFunction() {
    console.log("first");
}

function secondFunction() {
    console.log("second");
}


function thirdFunction() {
    console.log("third");
}

이렇게하면 단일 준비 기능으로로드 할 수 있습니다.

jQuery(document).on('ready', function(){
   firstFunction();
   secondFunction();
   thirdFunction();

});

그러면 다음 내용이 console.log에 출력됩니다.

first
second
third

이렇게하면 다른 이벤트에 기능을 재사용 할 수 있습니다.

jQuery(window).on('resize',function(){
    secondFunction();
});

이 바이올린이 작동하는 버전인지 확인하십시오.


0

합법적이지만 때로는 원하지 않는 행동을 유발하기도합니다. 예를 들어, MagicSuggest 라이브러리를 사용하고 프로젝트 페이지에 2 개의 MagicSuggest 입력을 추가했으며 각 입력 초기화마다 별도의 문서 준비 기능을 사용했습니다. 첫 번째 입력 초기화는 작동했지만 두 번째 입력 초기화는 작동하지 않았으며 오류도 발생하지 않았습니다. 두 번째 입력은 표시되지 않았습니다. 따라서 항상 하나의 문서 준비 기능을 사용하는 것이 좋습니다.


0

포함 된 html 파일 내에 문서 준비 기능을 중첩시킬 수도 있습니다. 다음은 jquery를 사용하는 예입니다.

파일 : test_main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <script src="jquery-1.10.2.min.js"></script>
</head>

<body>
    <div id="main-container">
        <h1>test_main.html</h1>
    </div>

<script>
    $(document).ready( function()
    {
        console.log( 'test_main.html READY' );
        $("#main-container").load("test_embed.html");
    } );
</script>

</body>
</html>

파일 : test_embed.html

<h1>test_embed.html</h1>
<script>
    $(document).ready( function()
    {
        console.log( 'test_embed.html READY' );
    } );
</script>

콘솔 출력 :

test_main.html READY                       test_main.html:15
test_embed.html READY                      (program):4

브라우저 쇼 :

test_embed.html


0

다음과 같이 할 수도 있습니다 :

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
 $(document).ready(function(){
     $("#hide").click(function(){
     $("#test").hide();
     });
     $("#show").click(function(){
     $("#test").show();
     });
 });
</script>
</head>

<body>
<h2>This is a test of jQuery!</h2>
<p id="test">This is a hidden paragraph.</p>
<button id="hide">Click me to hide</button>
<button id="show">Click me to show</button>
</body>

이전 답변은 단일 .ready 블록 내에서 여러 개의 명명 된 함수를 사용하거나 .ready 블록 외부의 다른 명명 된 함수와 함께 .ready 블록에서 명명되지 않은 단일 함수를 사용하는 것으로 나타났습니다. .ready 블록 내에 명명되지 않은 여러 함수가있는 방법이 있는지 조사하는 동안이 질문을 발견했습니다. 구문을 올바르게 얻을 수 없었습니다. 나는 마침내 그것을 알아 냈고, 내 테스트 코드를 게시함으로써 다른 사람들이 내가 가진 동일한 질문에 대한 답을 찾는 데 도움이되기를 바랍니다.


이것이 다른 답변과 어떻게 다른지 설명 할 수 있습니까?
Stephen Rauch

확인 : 이전 답변은 단일 .ready 블록 내부의 여러 명명 된 함수를 사용하거나 .ready 블록 외부의 다른 명명 된 함수를 사용하여 .ready 블록의 명명되지 않은 단일 함수를 사용하는 것을 보여주었습니다. .ready 블록 내에 명명되지 않은 여러 함수를 가질 수있는 방법이 있는지 조사하는 동안이 질문을 발견했습니다. 구문을 올바르게 얻을 수 없었습니다. 나는 마침내 그것을 알아 냈고 내 테스트 코드를 게시함으로써 다른 사람들이 내가 가진 동일한 질문에 대한 답을 찾는 데 도움이되기를 바랍니다.
JEPrice

미안, 나는 질문에 의미했다. 텍스트 상자의 왼쪽 하단에 편집 버튼이 있습니다. 솔루션이 다른 이유 / 더 나은 이유를 설명하면 미래 독자가 "왜"를 더 빨리 이해할 수 있기 때문에 훨씬 더 나은 답변을 얻을 수 있습니다. 감사.
Stephen Rauch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.