2016-11-17 70 views
-1

我遇到了一個Javascript函數的問題,該函數顯然會被調用得太快。我有一種預感,這是一個懸念問題,但我不確定。Javascript函數調用得太快

所以,我有該功能被分配給onclick一個<img>的:

function setModalPicture(picName){ 
 
    
 
    //Build the path to the picture 
 
    var pic= 'assets/img/art/'+picName; 
 
     
 
    //Set the picture 
 
    $('#g-modal-img').attr('src', pic);  
 
    
 
    adjustModalPadding();   
 
    
 
}

意圖是#克模態-IMG的src屬性應被設置爲img,然後才應調用adjustModalPadding。這是因爲adjustModalPadding需要#g-modal-img的高度,在src設置爲<img>之前爲零。但是,我注意到這不能正常工作,並且如果我使adjustModalPaddin g登錄到控制檯的高度#g-modal-img,它顯示爲零。我認爲這意味着該函數在src被設置爲<img>之前被調用。

+3

問題是圖片的尺寸未知unti l圖像成功*加載*。你需要在圖像中添加一個'onload'監聽器。有關重複問題,請參閱http://stackoverflow.com/a/626505/1902010。 – ceejayoz

+2

提升不會馬上執行您的功能。 – Gavin

+1

JavaScript **是一種「常規」編程語言。 –

回答

3

你需要等待圖像加載:

function setModalPicture(picName){ 

    //Build the path to the picture 
    var pic= 'assets/img/art/'+picName; 

    //Set the picture 
    var img = $('#g-modal-img'); 
    img.one("load", adjustModalPadding).attr('src', pic); 
    if (img[0].complete) { 
     img.off("load", adjustModalPadding); 
     adjustModalPadding();   
    } 
} 

注意上面的順序,因爲它是重要的:

  1. 首先,用一次性的處理程序掛鉤load事件(one)。
  2. 然後,設置src
  3. 檢查圖像是否已經完成:如果是,請刪除處理程序並立即調用您的函數;否則,當load觸發時,它將調用adjustModalPadding並將其作爲處理程序移除。

您可能需要增加搬運到錯誤...


這裏有一個工作示例:

function setModalPicture(picName) { 
 

 
    //Build the path to the picture 
 
    var pic = picName; // 'assets/img/art/'+picName; 
 

 
    //Set the picture 
 
    var img = $('#g-modal-img'); 
 
    img.one("load", adjustModalPadding).attr('src', pic); 
 
    console.log("img[0].complete after setting src: " + img[0].complete); 
 
    if (img[0].complete) { 
 
    img.off("load", adjustModalPadding); 
 
    adjustModalPadding(); 
 
    } 
 
} 
 

 
function adjustModalPadding() { 
 
    var img = $("#g-modal-img")[0]; 
 
    console.log("Size: " + img.width + "x" + img.height); 
 
} 
 
$("input[type=button]").on("click", function() { 
 
    console.log("img[0].complete before starting: " + $("#g-modal-img")[0].complete); 
 
    setModalPicture("https://graph.facebook.com/1035045703246692/picture?type=large"); 
 
});
<!-- In a comment, you said it starts out with src="" --> 
 
<img id="g-modal-img" src=""> 
 
<input type="button" value="Click Me"> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

,在Chrome瀏覽器對我的作品, Firefox和IE11。


或者,您也可以通過克隆創建替換img元素:

function setModalPicture(picName) { 
 

 
    //Build the path to the picture 
 
    var pic = picName; // 'assets/img/art/'+picName; 
 

 
    //Set the picture 
 
    var img = $("#g-modal-img"); 
 
    var newImage = img.clone(); 
 
    img.replaceWith(newImage); 
 
    newImage.one("load", adjustModalPadding).attr('src', pic); 
 
    console.log("newImage[0].complete after setting src: " + newImage[0].complete); 
 
    if (newImage[0].complete) { 
 
    newImage.off("load", adjustModalPadding); 
 
    adjustModalPadding(); 
 
    } 
 
} 
 

 
function adjustModalPadding() { 
 
    var img = $("#g-modal-img")[0]; 
 
    console.log("Size: " + img.width + "x" + img.height); 
 
} 
 
$("input[type=button]").on("click", function() { 
 
    console.log("img[0].complete before starting: " + $("#g-modal-img")[0].complete); 
 
    setModalPicture("https://graph.facebook.com/1035045703246692/picture?type=large"); 
 
});
<!-- In a comment, you said it starts out with src="" --> 
 
<img id="g-modal-img" src=""> 
 
<input type="button" value="Click Me"> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

,在Chrome瀏覽器,Firefox和IE11還爲我工作。


最後,您可以從頭開始創建(未克隆)的替代img元素:

function setModalPicture(picName) { 
 

 
    //Build the path to the picture 
 
    var pic = picName; // 'assets/img/art/'+picName; 
 

 
    //Set the picture 
 
    var img = $("#g-modal-img"); 
 
    var newImage = $("<img>").attr("id", "g-modal-img"); 
 
    img.replaceWith(newImage); 
 
    newImage.one("load", adjustModalPadding).attr('src', pic); 
 
    console.log("newImage[0].complete after setting src: " + newImage[0].complete); 
 
    if (newImage[0].complete) { 
 
    newImage.off("load", adjustModalPadding); 
 
    adjustModalPadding(); 
 
    } 
 
} 
 

 
function adjustModalPadding() { 
 
    var img = $("#g-modal-img")[0]; 
 
    console.log("Size: " + img.width + "x" + img.height); 
 
} 
 
$("input[type=button]").on("click", function() { 
 
    console.log("img[0].complete before starting: " + $("#g-modal-img")[0].complete); 
 
    setModalPicture("https://graph.facebook.com/1035045703246692/picture?type=large"); 
 
});
<!-- In a comment, you said it starts out with src="" --> 
 
<img id="g-modal-img" src=""> 
 
<input type="button" value="Click Me"> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

@richdotjs:不,「一」,而不是「開」。這是一個一次性處理程序。 –

+0

嗯。我嘗試了你的方法,就像在我拷貝你的代碼一樣 - 但它的行爲完全一樣。執行adjustModalPadding時,圖片的高度仍爲零。完成一個實際的方法/財產?我會說不(缺少(),它不會顯示在自動完成菜單中)。也許你的意思是把它當作'檢查圖像是否完整'的簡寫,但實際上我不知道該怎麼做。 – Nicola

+0

@Nicola:'complete'是一個實際的屬性:https://www.w3.org/TR/html5/embedded-content-0.html#dom-img-complete如果上面沒有,我會很驚訝,工作。但是,如果沒有,你可能會考慮用全新的'img'元素替換*'#g-modal-img',而不是僅僅改變它的'src'(在設置'src'之前再次掛載load'等)。 –

-1

當加載圖像您可以使用事件:

var logo = document.getElementById('g-modal-img'); 

logo.addEventListener("load", function() { 
    adjustModalPadding();   
}; 
+1

我儘量避免使用'.onload',而是使用'。的addEventListener(「負荷」,()= {})' – MayorMonty

+0

是的,它是更好的選擇:) – user2693928

+0

相同的答案上面試過你的方法,但畫面的高度仍然記錄爲零。 – Nicola