2016-06-20 127 views
2

我有一個jQuery change事件,當用戶更改給定SELECT元素。但是,該事件也可能由第三方腳本觸發。我想要做的是檢測事件是以編程方式還是由用戶觸發。jQuery - 檢測更改事件以編程方式觸發

我試圖在這個問題Check if event is triggered by a human 接受的解決方案,但注意的jsfiddle在這個答案是一個click事件,而不是一個change事件。

爲了證明我修改了小提琴,創造了這一個:http://jsfiddle.net/Uf8Wv/231/

如果試圖在這個最新的Firefox或Chrome,你會看到該警示human正在即使所示,當事件以編程方式觸發。

我試過event.originalEvent.isTrusted但這並不適用於所有瀏覽器。誰能幫忙?

回答

0

我已添加mouseenter和mouseleave事件。這個想法是,如果點擊符合元素上的鼠標指針,它就是人類。請參閱: http://jsfiddle.net/Uf8Wv/232/

$("#try").mouseenter(function(event) { 
    mouseover = true; 
}); 
// ... etc. 

我想不出任何其他方式。

0

您可以輕鬆檢測按鈕上的點擊事件是否實際上是由鼠標點擊觸發的。通過這樣做,

$('#click').click(function(ev) { 
    if (ev.which !== undefined && ev.button !== undefined) { 
     $("#try").click(); 
    } 
}); 

這裏的Fiddle

注:當心要麼ev.whichev.button的可能會導致0一些瀏覽器的左鍵點擊。

0

您可以檢查是否event.srcElement(這是在其上觸發的事件源元素)等於event.currentTarget類似:

$("#try").change(function(event) {console.log(event,event.target,event.currentTarget,event.srcElement) 
    if (event.currentTarget=== event.srcElement) { 
     alert(' human') 
    } else { 
     alert(' not human'); 
    } 
}); 

小提琴:http://jsfiddle.net/Uf8Wv/234/

0

你可以找到之間的一些模糊的區別點擊並模擬點擊使用此代碼:

$(document).on('change', "#try", function (event) { 
    //some difference appear in the next line 
    console.log(event.delegateTarget.activeElement); 
    //no difference 
    if (event.originalEvent === undefined) { 
     alert('not human') 
    } else { 
     alert(' human'); 
    } 
    event.delegateTarget = null;//doesn't help 

}); 

$('#click').click(function (event) { 
    $("#try").click(); 
}); 

點擊複選框日誌<input id="try" type="checkbox">
點擊按鈕日誌<button id="click">
但是...
在任何點擊日誌<body>之前以及點擊最後一次點擊後,從控制檯運行$("#try").click();
一般JS總是可以僞造任何客戶端事件。所以isTrusted永遠不會被信任。

0

您也可以收聽點擊事件,並修改一個變量。更改事件似乎的確很相似,它是一個真正的點擊或腳本觸發點擊,但點擊#操作事件將不會相同。而且由於點擊之前觸發更改,您有時間設置一個開關。 像這樣,例如:

var realClick; 
$("#try").change(function(event) { 
    console.log('change') 
    if (!realClick) { 
    alert('not human') 
    } else { 
    alert(' human'); 
    } 

});

$("#try").click(function(event) { 
    console.log('click') 
    // originalEvent is one way, but there will be many differences 
    if (event.originalEvent) { 
    realClick = true; 
    } else { 
    realClick = false; 
    } 
}); 

// Since this is called from outside, better not put 
// any controls here. 
$('#click').click(function(event) { 
    $("#try").click(); 
}); 

http://jsfiddle.net/2xjjmo09/3/

相關問題