2016-08-31 58 views
1

我想禁用某個函數作爲onclick事件運行。JS阻止函數作爲onclick事件運行

<a href="#" onclick="myfunc1();myfunc2();"></a> 

在這裏,我想禁用myfunc1,而不是myfunc2。其實我想從整個頁面禁用myfunc1,但無論如何,這是我唯一需要的。

我無法控制頁面,我正在使用userscript或其他腳本注入工具來實現此目的。

我已經試過什麼:

  1. 重新定義頁面加載後的功能:我已經嘗試添加一個事件偵聽器()與函數DOMContentLoaded事件{myfunc1 =函數(){} ; } 這似乎是工作,但在一個快速的互聯網連接的計算機,有時它運行之前定義myfunc1(在一個外部js文件,同步加載)。有沒有什麼方法可以保證函數在myfunc1被定義後執行?

  2. 有沒有什麼辦法可以'劫持'onclick事件來刪除myfunc1的名字?

回答

2

您應該使用事件偵聽器,然後您將能夠刪除一個與removeEventListener。如果你不能改變的HTML源代碼,您將需要的東西髒象

function myfunc1() { 
 
    console.log('myfunc1'); 
 
} 
 
function myfunc2() { 
 
    console.log('myfunc2'); 
 
} 
 
var a = document.querySelector('a[onclick="myfunc1();myfunc2();"]'); 
 
a.setAttribute('onclick', 'myfunc2();');
<a href="#" onclick="myfunc1();myfunc2();">Click me</a>

或者,也許你更喜歡霸王硬上弓函數,而不是事件處理程序:

function myfunc1() { 
 
    console.log('myfunc1'); 
 
} 
 
function myfunc2() { 
 
    console.log('myfunc2'); 
 
} 
 
var a = document.querySelector('a[onclick="myfunc1();myfunc2();"]'); 
 
var myfunc1_; 
 
a.parentNode.addEventListener('click', function(e) { // Hijack 
 
    if(a.contains(e.target)) { 
 
    myfunc1_ = window.myfunc1; 
 
    window.myfunc1 = function(){}; 
 
    } 
 
}, true); 
 
a.addEventListener('click', function(e) { // Restore 
 
    window.myfunc1 = myfunc1_; 
 
    myfunc1_ = undefined; 
 
});
<a href="#" onclick="myfunc1();myfunc2();">Click me</a>

0

這樣做的另一種方法是使用Jquery並設置t他onlick在錨標記null。然後你可以附加一個點擊函數,只需附加myfunc2()。

$(document).ready(function() { 
    $("a").prop("onclick", null); 
    $("a").click(function(){ 
     myfunc2(); 
    }); 
}); 
function myfunc1() { 
    console.log('1'); 
} 
function myfunc2() { 
    console.log('2'); 
} 

<a class="test" href="#" onclick="myfunc1();myfunc2();">Example</a> 

你可以在這裏看到codepen - http://codepen.io/anon/pen/BLBYpO

0

也許你到jQuery的。

$(document).ready(function(){ 
    var $btn = $('button[onclick*="funcOne()"]'); 

    $btn.each(function(){ 
     var newBtnClickAttr; 
     var $this = $(this); 
     var btnClickAttr = $this.attr("onclick"); 

     newBtnClickAttr = btnClickAttr.replace(/funcOne\(\)\;/g, ""); 

     $this.attr("onclick", newBtnClickAttr); 
    }); 
}); 

凡在可變$btn得到所有按鈕元素與包含funcOne()一個onclick屬性。

對於您的情況,這將是您想要刪除屬性的功能,例如myfunc1();

現在你已經選擇了所有具有onclick功能的元素。 循環它們並獲取當前屬性值,並通過將其替換爲空字符串來刪除函數名稱。

既然您的值不包含您替換的函數名稱,則現在可以使用值newBtnClickAttr更新onclick屬性值。

請檢查這個Sample Fiddle