>source

는 jQuery에서 $ (이)를 시작점으로 사용하여 SetInterval에서 DOM (위 /아래 /옆쪽)을 트래버스 할 수 있습니다.

jquery :

var autoTimer= setInterval(function(){
    //test code
}, 1000)

테스트 code 시도 :

if($(this).length !== 0) {
    alert('hello');
} //alerts hello
if($('body').length !== 0) {
    alert('hello');
} //alerts hello
if($('.className').length !== 0) {
    alert('hello');
} //alerts hello
if($('#id').length !== 0) {
    alert('hello');
} //alerts hello

문서 내부의 특정 요소가 $ (this)로부터 멀리 떨어져 있으며, 그런 다음 거기에서 DOM을 탐색 할 수 있습니다.

IE.

if ($('.className').find(something).length !== 0)... //works just fine

$ (이)를 횡단시키기위한 출발점으로 사용하려고 할 때 문제가 발생합니다.

테스트 code는 $ (이)를 시작점으로 사용하여 시도 :
(내가 말했듯이 ... 위의 다른 것들 중 하나와 함께 $ (이)를 대체하고 아래의 테스트 code를 괜찮아요. '바디'알리미를 사용하여 DOM을 가로 지르는 작업을 횡단합니다.

//traversing up the DOM
if($(this).parents('body').length !== 0) {
    alert('hello');
} //no alert (same with closest/parentsUntil/etc up the DOM)
//traversing sideways in the DOM
if($(this).siblings('body').length !== 0) {
    alert('hello');
} //no alert (same with next/prev/etc sideways in the DOM)
//traversing down the DOM
if($(this).find('body').length !== 0) {
    alert('hello');
} //no alert (same with children down the DOM)

$ (이) '몸'(또는 그 밖의 것의 다른 것)에서 시작하는 것은 위에서 다른 시작점에서 사실이 아닌 아무데도 존재하지 않는 것 같습니다.

및 SetInterval 내부의 $ (이)는 위에 사용 된 익명의 함수 호출로부터 명백한 글로벌 범위를 명확하게 지칭합니다 (적어도 내가 왜 '본문'을 찾을 수없는 유일한 설명)

나는 또한 명명 된 글로벌 함수를 다음과 같이 사용하여 시도했다 :

function testCode() {
    $.each($('.className'), function(){ //doesn't work with 'body' or '#id' either
        if($(this).parents('body').length !== 0) {
            alert('hello');
        }
    })
}
var autoTimer= setInterval(testCode, 1000) //no alert
var autoTimer= setInterval(function(){
    testCode();
}, 1000) //no alert

이 답변$ .proxy를 사용하여 이전 버전의 jQuery를 사용하면 작동하지만 '이 API는 jQuery 3.3에서 더 이상 사용되지 않고 jQuery 3.5를 사용하고 있습니다 ... 지금은 저에게 해결책이 아닙니다.

그리고 어느 것도 아닙니다 묶다방법 문서가 jQuery 3.0의 이름으로 증명하기 때문에 .bind ()는 더 이상 사용되지 않고 대체되었습니다. 의 위에방법 (그러나 여기서는 내가 (on () 어떤 효과를 보이는지 볼 수는 없지만, 어쩌면 그것은 내 상상력이 부족하기 때문입니다).

이렇게 내 질문을 다시 반복하기 위해 :
jQuery에서 $ (this)를 시작점으로 사용하거나 뭔가 잘못 뭔가를하고있는 것입니다 jQuery (위 /아래 /옆쪽)에서 jQuery (위 /아래 /옆쪽)를 트래버스 할 수 없습니다.

문제를 나타내는 실제 code를 알려주십시오. 당신은 우리에게 많은 code를 보여 주었지만 실제로 이것이 실제로 setTimeout 안에 있습니다. 실제로 우리에게 실제로 표시하지 않으면 code를 해결하는 방법을 보여주기가 어렵습니다.

JLRishe2021-05-09 17:26:15

나는 행동이 나를 배설하고, 내가 의도 한대로 작동하지 않는 이유에 대한 더 일반적인 설명이 있기 때문에 더 많은 일반적인 설명을 시도했다 (실제 code를 일으키는 실제 code를 얻기위한 유스 케이스를 얻었습니다). 더 많은 일반적인 code가 제공됩니다 (오, 그것은 setinteRerval이 아니라 settimeout이 아닙니다) :) :) :) -하지만 제안 당 편집 당 질문에 추가되었습니다

thothlike2021-05-09 17:26:15
  • 답변 # 1

    이것은 기본입니다Scoping 문제가 있고 jQuery와 거의 관련이 없습니다.

    가장 간단한 접근 방식은 할당하는 것입니다.콜백의 다른 변수 외부 :

    var that= this;
    setInterval(function () {
        $(that).parents();
    }, 1000);
    

    IE를 상관하지 않거나 빌드 프로세스가있는 경우 화살표 기능을 사용할 수 있습니다.밖에서 범위에서 :

    setInterval(()=> {
        $(this).parents();
    }, 1000);
    

    나의 개인적인 취향은전적으로 당신에게 많은 슬픔을주는 모든 cockamamie 행동 때문에. 당신의 예에서는 분명하지 않습니다가치가오고 있지만 여기에서는 피할 수있는 몇 가지 방법이 있습니다.

    //inside .each()
    $('a').each(function (_, el) {
        $(el).parents();
    });
    //inside event handler
    $('a').on('click', function (event) {
        $(event.target).parents();
    });
    

    멋진 ... 그것은 의도 한대로 정확히 일했습니다. 그리고 나는 당신의 대안을 찾고있을 것입니다. 그러나 당신은 너무 많이 감사합니다 ... 당신은 어떤 시간을 검색 /읽고, 제안한 것을 시도하는 데 몇 시간을 소비했는지 모릅니다. 솔루션은 내 upvote와 체크 표시를 가져옵니다 :)

    thothlike2021-05-09 17:26:15
  • 이전 node.js : NPM-V는 버전이옵니다
  • 다음 r facet_grid 행을 뒤집는 방법?