2010-07-17 39 views
3


如何爲現有的onclick事件添加更多行爲 如果現有的物體看起來像在javascript中爲現有onclick屬性添加更多行爲

<a href="http://abc" onclick="sayHello()">link</a> 
<script> 
function sayHello(){ 
    alert('hello'); 
} 

function sayGoodMorning(){ 
    alert('Good Morning'); 
} 
</script> 

我怎樣才能增加更多的行爲的onclick,這也將做以下

alert("say hello again"); 
sayGoodMorning() 

最好的問候, 凱沙夫

回答

9

這裏是最骯髒的方式:)

<a href=".." onclick='sayHello();alert("say hello again");sayGoodMorning()'>.</a> 

下面是一個有點理智的版本。裹成的一切功能:

<a href=".." onclick="sayItAll()">..</a> 

的JavaScript:

function sayItAll() { 
    sayHello(); 
    alert("say hello again"); 
    sayGoodMorning(); 
} 

而這裏的做的正確方法。使用事件註冊模型,而不是依賴onclick屬性或屬性。

<a id="linkId" href="...">some link</a> 

的JavaScript:

var link = document.getElementById("linkId"); 
addEvent(link, "click", sayHello); 
addEvent(link, "click", function() { 
    alert("say hello again"); 
}); 
addEvent(link, "click", sayGoodMorning); 

addEvent功能的跨瀏覽器實現如下(從scottandrew.com):

function addEvent(obj, evType, fn) { 
    if (obj.addEventListener) { 
     obj.addEventListener(evType, fn, false); 
     return true; 
    } else if (obj.attachEvent) { 
     var r = obj.attachEvent("on" + evType, fn); 
     return r; 
    } else { 
     alert("Handler could not be attached"); 
    } 
} 

需要注意的是,如果所有3個行動必須順序運行,那麼你仍然應該繼續並將它們包裝在一個函數中。但是這種方法仍然是第二種方法,儘管看起來有點冗長。

var link = document.getElementById("linkId"); 
addEvent(link, "click", function() { 
    sayHello(); 
    alert("say hello again"); 
    sayGoodMorning(); 
}); 
+0

+1 - 我會改變的唯一事情是從'addEvent'執行刪除'useCapture'跨保持一致性所有瀏覽器 – 2010-07-17 07:59:57

+0

嗨Anurag, 我想添加新的行爲與JavaScript即獲得現有的腳本onclick事件並附加更多的行爲。 我可以添加多個onclick監聽器,但IE只有attachEvent,它不支持addEvent或addEventListeners,它可以用來添加多個事件監聽器 – keshav84 2010-07-17 08:01:55

+0

@Russ - 好主意,將刪除'useCapture'。 – Anurag 2010-07-17 08:17:39

0

一種方法是寫第三個功能:

<a href="http://abc" onclick="foo()">link</a> 
<script> 
function sayHello(){ 
    alert('hello'); 
} 

function sayGoodMorning(){ 
    alert('Good Morning'); 
} 

function foo() { 
    alert("say hello again"); 
    sayGoodMorning(); 
} 
</script> 
0

<a href="http://abc" onclick="sayHello(),sayX(),sayY(),sayZ()">link</a>

也將工作

0

假設你的代碼略有變化:

<a href="http://abc" id="a1" onclick="sayHello()">link</a> 

在純醇」的JavaScript,你會做這樣的事情。

var a = document.getElementById('a1'); 
a.onclick = function() { alert('say hello again'); a.onclick(); } 

值得注意的是,jQuery使這一點更容易。例如,請參閱clickbindone的文檔,並且一般在event handler attachment的部分。

+0

小心!你會陷入一個無限循環:你調用a.onclick()調用a.onclick()本身;) – Eliott 2017-03-31 08:18:17

6

另一種未提及的方式是捕獲當前分配給element.onclick屬性的函數,然後分配一個包裝舊函數的新函數。一個簡單的實現來證明會是這樣的

function addEvent(element, type, fn) { 
    var old = element['on' + type] || function() {}; 
    element['on' + type] = function() { old(); fn(); }; 
} 

var a = document.getElementById('a'); 

function sayHello(){ 
    alert('hello'); 
} 

function sayGoodMorning(){ 
    alert('Good Morning'); 
} 

addEvent(a, 'click', sayHello); 
addEvent(a, 'click', sayGoodMorning); 

Working Demo這裏

+0

謝謝,這是我需要的(用javascript擴展現有的行爲,上面的addevent方法非常非常)非常感謝,向我介紹jsfiddle看起來像一個偉大的調試和共享工具 – keshav84 2010-07-17 08:26:03

相關問題