2016-08-29 67 views
-1

我感覺我失去了一些明顯的東西,但只是可以看到它。Javascript:停止onClick默認

上的click事件觸發設置:

anchor.addEventListener("click", myClickEvent); 
 

 
function myClickEvent() { 
 
    this.preventDefault(); // fails 
 
    return false; 
 
}

但是默認的onClick方法仍然發生。

我可以在與addEventListener同時取消默認傳播嗎?還是有其他方法可以做到這一點。我無法在myClickEvent中使用.preventDefault(),因爲該事件在該點不可用。

編輯以下評論以清楚起見: 標記的默認onClick發生,即使myClickEvent返回false。

+1

你是什麼意思的默認onClick? – Cristy

+1

爲什麼ClickEvent中沒有可用的事件? – Neal

+0

使用[removeEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener)刪除事件處理程序,或者直接使用element.onclick,而不是通過addEventListener添加多個處理程序。你在說什麼「默認」點擊事件?沒有,直到你指定一個。 – ManoDestra

回答

2

從註冊爲addEventListener的處理程序返回false將不會執行任何操作。見https://stackoverflow.com/a/1357151/227299https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault

推薦的方法是調用event.preventDefault()

function myClickEvent(e) { 
    e.preventDefault() 
} 

處理程序從HTML屬性仍然可以工作,但因爲它是不清晰相比event.preventDefault()當什麼return false意味着你不應該使用它(不允許鏈接遵循)和event.stopPropagation()(不要讓事件冒泡)

2
element.addEventListener("click", myClickEvent); 

function myClickEvent(event) { 
    event.preventDefault(); 
    return false; 
} 
+2

@Michal - 你原來的答案沒有錯...... – Neal

+0

是的,我編輯了參數名稱,但它是如何變成一個全局變量? –

+0

@MichałMłoźniak我看到沒有錯。考慮將其恢復原始狀態。 – Neal

0

有在全球範圍內無此功能稱爲preventDefault - 您需要使用已傳入您的回調的事件。

此外請確保您將活動附加到可以點擊(窗體,錨點,按鈕等)可能可能有一個事件被阻止。

如果將事件附加到子/父元素,則不會按預期工作。

0

幾乎在那裏得益於Teemu的代碼,但不完全。

根據函數的調用方式有所不同。看似有兩個發送定義的值的隱藏的參數「這個」,並且當不帶參數稱爲發送作爲第一個可見的參數的自動事件對象:

呼叫它不帶參數:

anchor.addEventListener("click", myClickEvent); 
 

 
function myClickEvent(param1, param2) { 
 
    // this = events parent element (<a>) 
 
    // this.href = <a href=...> 
 
    // param1 = event object 
 
    // param2 = undefined 
 
    oEvent = param1; 
 
    oEvent.preventDefault(); 
 
}

但隨後的參數調用它:

anchor.addEventListener("click", function (oEvent) { myClickEvent(oEvent, myParameter); }); 
 

 
function myClickEvent(param1, param2) { 
 
    // this = [object Window] 
 
    // this.href = undefined 
 
    // param1 = event object 
 
    // param2 = myParameter 
 
    oEvent = param1; 
 
    oEvent.preventDefault(); 
 
}

注意如何在參數ameters手動發送'this'的值從事件父元素改變爲'[object Window]',導致this.href出錯。

但是,preventDefault現在似乎工作可靠。

+0

注意,你可以傳遞上下文我也只是爲了簡單而將它留在評論之外。 – Teemu

+0

當你說我也可以傳遞上下文,你的意思是我有一些方法可以將外部'this'傳遞給函數,以便函數中使用'this'指向正確的外部'this'? – NickC

+0

將上下文分配給外部範圍中的變量,並在'myClickEvent'的參數列表中傳遞該變量。 – Teemu