0

페이지 변경시 일부 이미지를 삽입하는 프레임 워크 (vue.js)가 있습니다 (실제 페이지를 새로 고치지 않고 라우터 사용). 직접로드 할 때, 페이지가 로딩 화면을 표시 할 수 있습니다 : 페이지가 프레임 워크를 통해 탐색 된 경우창 자체가로드 된 후 로딩 이벤트를 트리거하는 방법은 무엇입니까?

loading = true; 
$(window).on('load', function(){ 
    loading = false; 
}); 

그러나, $(window).on('load')이 실행되지 않습니다. 이것은 window이 이미로드되어 있고 새 이미지로드가 더 이상 창에 연결되어 있지 않기 때문입니다. 따라서 창이 이미로드되어 있으므로 loading = false이 실행되지 않습니다.

여기에 매우 단순화 된 예입니다,하지만 같은 점을 보여

//Loading the initial image, it works fine because it runs on window load. 
console.log('Loading first image...') 
$(window).on('load',function(){ 
    console.log('First image loaded'); 
}); 


$('button').on('click',function(){ 
    $('div').append('<img src="https://placekitten.com/200/300">'); 
    console.log('Loading extra image...'); 

    //This never triggers because the window is already loaded. 
    //I need something to trigger while the appended images are loading 
    $(window).on('load',function(){ 
    console.log('Extra image loaded.'); 
    }); 

}); 

HTML :

<img src="https://placekitten.com/200/300"> 
<button>Click to load extra</button> 
<div></div> 

가 여기 codepen입니다.

당신은 고유 식별자로 각각의 새로운 이미지에 .load() 리스너를 추가, 당신은 한 번에 모든 이미지를로드하는 기능을 실행하는 데 사용할 수있는 배열을 추적 할 수 있습니다
+0

아니 생각,하지만 당신은 시도 :

는 여기 codepen이 보여주는거야? (나는 당신이'on'으로 이벤트를 일으킬 수 있다고 생각하지 않습니다.)하지만 물어야합니다, 왜 이것을해야합니까? 새 이미지를 별도로로드 할 수 있습니다. – DBS

+0

이미지를 페이지에 추가하기 전에 이미지를로드하면로드 된 모든 코드를 실행할 수 있습니다. http://stackoverflow.com/questions/10863658/load-image-with-jquery-and-append-it-to-the -dom – DBS

+0

@DBS 이미지가 실제로로드되었는지 여부에 관계없이로드 이벤트를 트리거 할 수는 없습니까? 내가 어떻게 세울거야? 로딩을 별도로 듣고 언급했습니다. 또한 이것이 무슨 뜻인지 확실하지 않습니다. 두 번째 의견에 대해서는 안타깝게도 실제로 사용하고있는 프레임 워크의 옵션이 아닙니다. 아무리 어려움없이, 어쨌든. –

답변

0

@hakJav의 해결책은 올바른 방향 이었지만 약간의 수정이 필요했습니다. 그들은 내 자신의 답변을 게시하기로 결정할만큼 충분히 중요했습니다. 그의 대답이 반드시 내 문제를 해결하지는 못했지만 좋은 코드 일 뿐이며 다른 사람의 해결책 일 수도 있습니다. 확실히 두 답을 모두 확인하십시오.

가 여기 내 JS 기능입니다 (내 원래의 게시물에서 HTML로 간다) :

$('button').on('click',function(){ 
     $('div').html('<img src="https://placekitten.com/200/400"><img src="https://placekitten.com/100/300">'); 
     var loadingImages = []; 
     //Array of existing images 
     var arrayOfImages = $('div').find('img'); 
     //Loops through array 
     for(var i=0; i < arrayOfImages.length; i++){ 
      //Creates numerical value for each image, puts it in an array of images that are currently loading 
      loadingImages.push(i); 

      //For each image, add a load listener. Pass in i from the for loop so that it gets recorded in the event listener. 
      $(arrayOfImages[i]).on('load', { currentImage: i }, function(event){ 
       //On load, removes the value from the array. Display which image loaded, for debugging. 
       var index = loadingImages.indexOf(event.data.currentImage); 
       loadingImages.splice(index, 1); 
       console.log('image '+event.data.currentImage+' loaded'); 

       //Checks if the array is empty (last image loaded). If so, log all. 
       if(loadingImages.length === 0){ 
        console.log('all loaded'); 
       } 
      }); 

     } 

}); 

이 컨테이너에 이미 모든 이미지를 반복 할 수 있다는 장점을 가지고 있으며, 반드시 인에 의존하지 html에 데이터 속성을 추가 할 수 있습니다. 또한 이미지의 "그룹", 즉 동일한 HTML 문자열의 여러 이미지를 처리 ​​할 수 ​​있습니다. 아마 더 확장 성이 있습니다.

.html().append()으로 바뀌는 경우와 같이 첫 번째 세트를 통과 한 후에 추가 이미지를로드 할 수 없다는 단점이 있습니다. 원본 이미지는 여전히로드되어 완전히로드되어 해당 값이 배열에 유지됩니다. 필요한 경우 (아마도 한 번에 한 세트의 이미지 만로드해야 함)이 작업은 일부 작업으로 수정 될 수 있습니다. `,`$ (창) .trigger ('로드') : http://codepen.io/Blue_Dragon360/pen/GqjyGJ?editors=1010

이 작동하는 경우
1

:

var loadingImages = []; 
$('button').on('click',function(){ 

    //Get unique identifier + add to 'loading' 
    var n = $('div').find("img").length; 
    loadingImages.push(n); 

    //Add image with unique classname 
    $('div').append('<img data-n="'+n+'" src="https://placekitten.com/200/300">'); 

    //Attach load listener to new image 
    $('div').find("img[data-n="+n+"]").load(function(){ 
    var n = $(this).attr('data-n'); 

    //Remove from 'loading' 
    var index = loadingImages.indexOf(n); 
    loadingImages.splice(index, 1); 

    //if 'loading' empty, run function 
    if(loadingImages.length==0){ 
     alert("Loaded All Images"); 
    } 
    }); 
}); 

예 : JSFiddle

+0

와우, 이쪽은 꽤 가깝습니다. 거의 거기에있는 것처럼 보입니다. 그러나 내 문제는 예제보다 조금 복잡합니다. 'last()'이미지가 반드시 마지막으로로드되는 것은 아닙니다. 함수를 트리거하기 전에 모든 ''이로드되도록 이것을 수정하는 방법을 생각해 볼 수 있습니까? 나는 붙어있다. –

+0

흠 ... 나는 그것을 얻었다고 생각합니다. 위의 편집을 참조하십시오. 각 IMG에 고유 한 식별자를 추가하고 코드가 비어있는 경우 (이 경우 간단한 경고) 어레이의 각로드 이미지를 추적합니다. – hakJav

+0

하, 멋진 솔루션! 나는 그것을 시도하고 그것을 실행하는 방법을 볼게. –