回答
您通常不希望嚴格檢查resize事件,因爲當您執行動態調整大小時,會觸發大量事件,例如jQuery中的$(window).resize,並且據我所知,沒有本地調整大小元素事件(there is on window)。我會檢查它的時間間隔,而不是:
function onResize(element, callback){
var elementHeight = element.height,
elementWidth = element.width;
setInterval(function(){
if(element.height !== elementHeight || element.width !== elementWidth){
elementHeight = element.height;
elementWidth = element.width;
callback();
}
}, 300);
}
var element = document.getElementsByTagName("canvas")[0];
onResize(element, function(){ alert("Woo!"); });
畫布狀態保存爲的imageData,然後調整
var imgDat=ctx.getImageData(0,0,ctx.canvas.width,ctx.canvas.height)
後重繪調整後
ctx.putImageData(imgDat,0,0)
該問題正在檢測調整大小發生的時間。 – rampion 2011-04-29 02:29:20
套件桑德的回答會做很多不必要的工作,而瀏覽器窗口沒有調整大小。最好檢查事件是否響應瀏覽器事件而調整大小,然後在給定時間內忽略調整大小事件,然後再次執行檢查(這會在連續快速連接後導致兩次檢查並且代碼可能是改進以防止這種情況發生,但你可能會明白)。
(function(){
var doCheck = true;
var check = function(){
//do the check here and call some external event function or something.
};
window.addEventListener("resize",function(){
if(doCheck){
check();
doCheck = false;
setTimeout(function(){
doCheck = true;
check();
},500)
}
});
})();
請注意,上面的代碼是盲目輸入的,沒有檢查。
大衛Mulder的回答是一個進步,但它看起來像它會在第一 resize事件後等待超時毫秒後觸發。換句話說,如果在超時之前發生更多大小調整,它不會重置計時器。我在尋找相反的東西;我想要一些等待一小段時間讓調整大小事件停止的事情,然後在經過一段時間後在一段時間後觸發。下面的代碼就是這樣做的。
任何當前正在運行的計時器的ID將在timer_id中。所以,無論何時調整大小,它都會檢查是否已經有一段時間在運行。如果是這樣,它就取消那個並開始一個新的。
function setResizeHandler(callback, timeout) {
var timer_id = undefined;
window.addEventListener("resize", function() {
if(timer_id != undefined) {
clearTimeout(timer_id);
timer_id = undefined;
}
timer_id = setTimeout(function() {
timer_id = undefined;
callback();
}, timeout);
});
}
function callback() {
// Here's where you fire-after-resize code goes.
alert("Got called!");
}
setResizeHandler(callback, 1500);
我沒有發現任何內置事件來檢測新的畫布尺寸,所以我試圖找到兩種方案的解決方法。
function onresize()
{
// handle canvas resize event here
}
var _savedWidth = canvas.clientWidth;
var _savedHeight = canvas.clientHeight;
function isResized()
{
if(_savedWidth != canvas.clientWidth || _savedHeight != canvas.clientHeight)
{
_savedWidth = canvas.clientWidth;
_savedHeight = canvas.clientHeight;
onresize();
}
}
window.addEventListener("resize", isResized);
(new MutationObserver(function(mutations)
{
if(mutations.length > 0) { isResized(); }
})).observe(canvas, { attributes : true, attributeFilter : ['style'] });
爲了檢測任何JavaScript canvas.style變化,MutationObserver API是良好的。它不檢測特定的樣式屬性,但在這種情況下,檢測canvas.clientWidth和canvas.clientHeight是否已更改就足夠了。
如果使用百分比單位在style-tag中聲明畫布大小,那麼使用JavaScript正確解釋css選擇器(>,*,:: before,...)會有問題。我認爲在這種情況下,最好的方法是設置一個window.resize處理程序,並檢查畫布客戶端的大小。
- 1. 調整QPixmap的畫布大小畫布
- 2. 畫布大小調整
- 3. 調整大小HTML5畫布
- 4. 調整畫布大小
- 5. Flex畫布調整大小
- 6. HTML5畫布調整大小
- 7. C#畫布調整大小
- 8. 畫布元素,畫圈調整大小
- 9. 如何在調整大小時調整畫布大小?
- 10. 調整大小的畫布內容
- 11. 調整位圖畫布的大小
- 12. 使用畫布的ID調整大小?
- 13. 調整大小矩形HTML5畫布
- 14. 調整圖像大小在畫布上
- 15. HTML5畫布僅調整大小html
- 16. JavaFX在fxml中調整畫布大小
- 17. GIMP - 腳本調整畫布大小
- 18. WPF畫布不會調整大小
- 19. html5畫布圖像調整大小
- 20. HTML5響應畫布大小調整
- 21. Flexbox調整大小事件(?)
- 22. FullCalendar事件調整大小
- 23. WPF約束畫布的大小調整子對象到畫布
- 24. 用javascript/jquery動態調整畫布窗口的大小?
- 25. Javascript動畫圖像調整大小
- 26. Javascript文件大小調整
- 27. 的Javascript畫布大小
- 28. 畫布圖像調整大小使文件變大
- 29. 圖像調整大小然後在畫布中旋轉 - javascript
- 30. Javascript SDK錯誤和畫布調整大小問題
您的代碼中有多少個不同的地方是您重新調整畫布大小?你能不能在你改變尺寸後調用你的重繪函數? – robertc 2011-04-28 23:03:40
我不想斷言我是唯一一個調整特定畫布的大小。 – rampion 2011-04-29 02:30:17
我不知道它是否適合你,但我使用'requestAnimationFrame()'重繪每一幀 - 我得到60fps,我不必擔心重新調整時它的尺寸調整 – Zac 2016-07-04 14:07:47