2011-09-21 65 views
26

我有兩個事件,一個檢測的窗口大小調整等檢測div的可調整大小的停止。jQuery UI的可調整大小的防火窗resize事件

但是當我調整DIV,在控制檯檢測窗口resize事件。

有什麼辦法來阻止呢?

$(document).ready(function(){ 
    $(window).bind('resize', function(){ 
     console.log("resize");  
    }); 
    $(".a").resizable(); 
}); 

例子:http://jsfiddle.net/qwjDz/1/

+0

這必須是一個錯誤。當一些元素的寬度和高度發生變化時,它與窗口大小調整無關。 –

回答

21

你看到因爲事件冒泡的這種行爲。一種解決方法:使用event.target檢查回調事件源:

$(window).bind('resize', function(event) { 
    if (!$(event.target).hasClass('ui-resizable')) { 
     console.log("resize"); 
    } 
}); 

演示:http://jsfiddle.net/mattball/HEfM9/


另一個解決方案是一個resize處理程序添加到可調整大小和停止事件的傳播起來DOM樹(這是「冒泡」)。編輯:這應該工作,但由於某種原因沒有:http://jsfiddle.net/mattball/5DtdY

+2

Upvote因爲op不知道如何操作。 –

+0

謝謝!這升級到jQueryUI 1.6後(從1.5)開始,我不知道什麼是錯的。現在我正在過濾如上所述的調整大小事件並且它可以工作。 – BastiBen

+0

@馬特球 - 作爲event.target元素不是元素本身,而是調整大小處理程序(至少在1.8版本)。所以最好將類名與** ui-resizable-handle **進行比較,或者將event.target與窗口元素本身進行比較。 – Mohoch

6

我覺得其實最安全的是做到以下幾點:

$(window).bind('resize', function(event) { 
    if (this == event.target) { 
     console.log("resize"); 
    } 
}); 
+1

這對我來說不適用於IE8,其中'event.target '和'window'一樣。這對我的作品被檢查鼠標座標的存在的解決方案:如果'event.clientX'定義,它是一個jQuery的調整大小事件。如果'event.clientX'沒有被定義,則它是一個「真正的」窗口大小。 – Blaise

3

對於我來說,用jQuery 1.7 .2這裏提出的解決方案都沒有工作。因此,我不得不拿出一個稍微不同的一個在舊的ie瀏覽器以及Chrome的工作...

$(window).bind('resize', function(event) { 
    if ($(event.target).prop("tagName") == "DIV") {return;} // tag causing event is a div (i.e not the window) 
    console.log("resize"); 
}); 

這可能需要進行調整,如果調整該元素是別的東西比<div>

23

所有這些答案都無濟於事。問題是調整大小的事件冒泡到窗口。所以最終e.target將成爲窗口,即使resize發生在div上。所以,真正的答案是簡單地停止傳播resize事件:

$("#mydiv").resizable().on('resize', function (e) { 
    e.stopPropagation(); 
}); 
+3

這是去(有目標黑客甚至clientX只會導致問題)的最佳方式。 – suda