2016-04-21 77 views
0

S/O!

我需要一個可靠的方法來檢測是否$(window).on('resize')已被用戶交互觸發或通過jQuery .trigger調用。

我試過以下,但我似乎並沒有得到這些參數早在函數調用:

$(window).trigger('resize',[true]); 

function prepareOnResize(e, triggered){ console.dir(triggered); } 
$(window).on('resize',prepareOnResize); 

觸發好像又回到了屏幕的寬度,所以我嘗試以下,也無濟於事:

$(window).trigger('resize',[true]); 

function prepareOnResize(e, width, height, triggered){ console.dir(triggered); } 
$(window).on('resize',prepareOnResize); 

在這種情況下觸發回來undefined

我在這裏虧本 - 任何幫助將不勝感激。謝謝!

+1

第一個例子應該可以工作。 [它對我很好](https://jsfiddle.net/0wqrq0z5/1/) – Andy

回答

1

的jQuery把一個屬性isTrigger在事件對象,你可以測試:

function prepareOnResize(e){ 
    if (e.isTrigger) { 
     console.log('resize via jQuery trigger'); 
    } else { 
     console.log('resize by user'); 
    } 
} 

或者您可以使用e.originalEvent,其中jQuery的只有本地事件對象有,如前所述here

function prepareOnResize(e){ 
    if (!e.originalEvent) 
     console.log('resize via jQuery trigger'); 
    } else { 
     console.log('resize by user'); 
    } 
} 
+0

我也試過這個,但對於'resize'事件似乎總是設置爲'3':\看起來' resize'事件的處理方式與瀏覽器不同,處理的方式與「click」或「mouseover」等典型事件不同。 –

+0

可能依賴於瀏覽器,因爲它適用於我。我在答案中增加了一個替代方案。 – trincot

+0

嘗試原始事件 - 每次都會返回undefined,無論事件是如何觸發的。 –

2

你可以嘗試以下;

的Javascript ... DOM的準備......

var $window = $(window); 

$window.on('resize', function(event, param1) { 

    console.log("Window resized event triggered by..."); 

    if (typeof param1 === 'undefined') // could also do if(param1) to test for false 
    console.log("System Event"); 
    else 
    console.log("User Event"); 

    // Another way to check is to check the originalEvent property 
    // if (e.originalEvent === undefined) alert ('triggered by code'); 
    // else alert ('triggered by system'); 

}); 

setTimeout(function() { 
    $window.trigger("resize", ["Custom"]); 
}, 2000); 

這或多或少你試圖在你的代碼,它會區分兩種類型的事件。

我也能發的jsfiddle所以你可以看到: https://jsfiddle.net/sysdevcode/4w3b8e14/

爲了使您的代碼工作

$(window).trigger('resize',[true]); 

function prepareOnResize(e, width, height, triggered){ console.dir(triggered); } 
$(window).on('resize',prepareOnResize); 

您需要更改則params的順序上prepareOnResize()功能, 作爲$(window).trigger('resize',[true]);等同於在您的函數中作爲「寬度」參數發送的[true]。您沃爾德需要做的,例如:

var $window = $(window); 
$window.trigger('resize',[ $window.width(), $window.height(), true ]); 

然後

function prepareOnResize(e, width, height, triggered){ ... } 

會的工作,但如果你不需要傳遞任何參數,可以再上面的代碼的e.isTrigger可能是有點更加優雅。

+0

你有錯誤代碼。檢查'console.log(窗口...)' – Robert

+0

謝謝羅伯特,是從小提琴複製,沒有注意到..糾正 –

+0

感謝您的信息,@DevOps!沒有意識到參數的排序行爲。很高興知道:) 如果有人想知道,我已經結束了使用'e.originalEvent'來處理這個問題。在nixing那令人煩惱的插件劫持了我的本地調整大小事件之後,現在一切都變得更加乾淨了:) –

相關問題