1. 程式人生 > >js用addeventlistener繫結事件,阻止預設事件。

js用addeventlistener繫結事件,阻止預設事件。

       var linkG = document.getElementById('g');
                linkG.addEventListener('click', function(e){
                        test();
                        e.preventDefault();
                }, false);


測試地址:http://thecdn.sinaapp.com/page/demo/link-test3/
這次,所有的地址都不會修改,且都不會跳轉了,獲取資料也正常了。
和之前的區別在哪裡呢?
event.preventDefault();
如果我們要使用a標籤做按鈕使用,那麼一定要記得阻止預設事件。
或許你會說,你這個寫的麻煩,我一個return false就解決問題了,
如果真的是這樣的話,那麼請自行嘗試,至少我測試chrome中第三個demo中,繫結事件使用return false不可以阻止預設事件。
當然,如果你寫在元素的內聯事件如onclick中的return false還是可以阻止預設的。
哦,那麼這些測試是毫無價值的麼,顯然不是,上面這段測試,顯示瞭如果使用良性的html/css/js三層分離的註冊事件來驅動頁面,
那麼使用a作為事件驅動的元素,務必加上event.preventDefault();
到這裡該談的基本都談完了,那麼我們來談談具體的事情吧。
上面的A~G幾種形式的寫法,各有利弊,在不同的環境或許都是最有解。
我們先談談好處:
第一種:直接呼叫頁面中的全域性函式,簡單粗暴,無論什麼時候都不會修改url,發生上面例子中的url改變的事情發生。
第二種:呼叫一個noop函式,即空函式,類似寫法還有void(’0′);可參考o‘reilly ajax hacks那本書,由於沒有寫死呼叫的函式,我們可以通過繫結事件把動作附加到元素上,也不會發生上面改變url的事情發生。
第三種:相容第二種的好處之上,防止寫碼的時候忽略了preventDefault的處理。
第四種:傳統的簡單粗暴寫法/
第五種:使用錨點+繫結事件的方法來進行動作附加,即使js指令碼沒有下載完畢,也不會發生報錯,而且符合三層分離的原則。而且錨點也可以表現語義化動作。
第六種:某大牛發現了 “空路徑對頁面效能影響的解決方案”,有興趣可以搜尋並測試,如果你測試了,不妨告訴我,謝謝。(不確定會對a的href也產生影響)
第七種:完全的無額外內容。
然後世界開始分裂,我要開始吐槽了:
第一種:直接呼叫偽協議的方式呼叫函式,現代瀏覽器中一致性很好,但是不確定在古老的瀏覽器中可以保持一致性。而且直接呼叫只能呼叫全域性函式,不利於函式結構組織。
第二種:整合第一種的劣勢。
第三種:整合第一種的劣勢,且沒有考慮三層分離。
第四種:且沒有考慮三層分離。
第五種:如果指令碼沒用下載完畢,會修改url hash,如果協同寫碼,別人使用到url操作,且沒有做去除hash處理,機率發生問題,如之前的測試。
第六種:不論會不會產生頁面效能積極影響,about:blank作為額外的無語義內容就是讓人不爽的。
第七種:這貨不是一個標準的a標籤,還記得之前說要看RFC和W3C標準嘛?
可能有的童鞋懶的找,我把內容貼一下:
Non-empty URL potentially surrounded by spaces
A URL that is not the empty string, optionally with leading and/or trailing space characters.
Absolute URL potentially surrounded by spaces
A valid IRI as defined in [RFC 3987], optionally with leading and/or trailing space characters.
接著我們在來看一個小東西,事件繫結次數,即控制代碼數量:
第一種:0,環保
第二種: 1
第三種: 2 周全的代價
第四種: 1
第五種: 1
第六種: 1
第七種: 1
我發現我有話癆屬性,多提一個事情吧:
淘寶首頁使用javascript: 10處
淘寶首頁使用#: 10處
Github內頁首頁使用javascript: 0處
Github內頁首頁使用#: 9處
360首頁使用javascript: 0處
360首頁使用#: 7處
騰訊首頁使用javascript: 37處
騰訊首頁使用#: 11處
新浪首頁使用javascript: 26處
新浪首頁使用#: 0處
其他的大家自己搜尋的玩唄~~
現在都流行開放式結局,那麼,文章就此EOF。
至於選擇哪個方案,我覺得大家都心裡有數了,歡迎討論~

原文連結:
http://soulteary.com/2013/01/11/let-talk-about-tag-a.html

相關推薦

jsaddeventlistener事件阻止預設事件

       var linkG = document.getElementById('g');                 linkG.addEventListener('click', function(e){                         test();             

原生js實現雙向資料實現前端提交到後臺

問題 專案開發遇到一個問題,就是在提交到後臺的時候遇到一個請求甲方資料,來實現在新增資料的時候,將請求到甲方的資料展示在前端頁面,讓甲方看到他到底添加了哪些資料。因此,使用到了雙向繫結,來顯示彈框中我們選中的資料庫。 使用到技術 使用了boot

CVTE面試題——解決addEventListener的函式傳參無效問題

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head&g

阻止事件冒泡阻止預設事件阻止所有事件的方法

阻止事件冒泡? w3c用的是stopPropagation(),IE用的是cancelBubble=true。 阻止預設事件的方法? w3c用的是preventDefault(),IE用的是ret

阻止事件冒泡阻止預設事件

首先事件共分為三個階段: 捕獲階段:事件從文件根元素開始逐層向下傳遞,直到找到事件目標, 目標階段:找到事件目標並觸發相應的事件, 冒泡階段:從目標逐層向上返回到根節點。 事件冒泡:顧名思義就是事件一級一級向上觸發,直到window/document結束。 較常見的事

Javascript 冒泡和捕捉取消冒泡阻止預設事件

冒泡:從下到上捕獲:從上到下我們之前介紹到,addEventListener函式的第三個引數false為冒泡,true為捕獲,1.先看一下冒泡的情況,如下程式碼<!DOCTYPE html> <html lang="en"> <head>

詳解javascript如何阻止冒泡事件阻止預設事件

在說事件冒泡之前,我們先說說事件物件(Event) Event 1、在觸發DOM上某個事件時,會產生一個事件物件event,這個物件包含著所有事件有關的資訊(導致事件的元素、事件的型別、與特定事件相關的資訊) 2、所有瀏覽器都支援Event物件,但支

js給div事件實現點選切換效果的幾種方式總結

用js給div繫結事件,實現點選切換效果,總結有如下幾種方式 script type="text/javascript"> function btnAction() { var titleNValue = document.getElementBy

冒泡與捕獲事件阻止事件冒泡阻止預設行為

Internet Explorer 8 及更早IE版本不支援 addEventListener() 方法,Opera 7.0 及 Opera 更早版本也不支援。 但是,對於這些不支援該函式的瀏覽器,你可以使用 attachEvent() 方法來新增事件控制代碼。對於事件繫結相

JavaScript 中 當live多個同名事件如何移除事件

先介紹一下我的問題出現的環境: 公司用的dwz框架,需求是在一個頁面點選,載入一個dialog彈出框,每一個頁面都是一個單獨的jsp檔案:其中在彈出的dialog的那個頁面檔案中,有下面一段程式碼: 因為dwz框架的實現機制,就是把當前的程式碼片段載入到主頁面中,所以想給

JS事件函式事件捕獲事件冒泡

1 事件繫結:事件與函式繫結的方式 1.1 元素.onclick這種形式,如下: 1 <div id="div1">aaa</div> 2 3 <script type="text/javascript">

jquery 一個按鈕click事件第一次點選後一切正常第二次點選竟然執行兩次以後越來越多

用jquery  繫結一個按鈕click事件後,第一次點選後,一切正常,第二次點選,竟然執行兩次,以後越來越多。 後來檢視文件發現  jquery click  不是 替換原有的function  而是接著新增,所以才會執行次數越來越多。 這有就可以在新增之前要先解除cli

Js事件函式名加括號和不加括號有什麼區別

一,在js程式碼裡     加括號代表呼叫,執行這個方法;     不加括號目的是引用,代表把這個函式賦值給某個變數。       在下面程式碼裡:   1.1   btn.onclick=aa;是正

微信小程式關於navigator子元素事件阻止navigator跳轉

第二個item裡邊,switch切換時,會自動觸發navigator跳轉,找了好久也沒有找到類似於e.preventDefault方法,想了一個辦法, 如圖,第一個item,那就是,把switch拿出來,和navigator為兄弟元素,然後把switch定位,點選時,

jquery 一個按鈕click事件第一次點選後一切正常第二次點選竟然執行兩次以後越來越多

用jquery  繫結一個按鈕click事件後,第一次點選後,一切正常,第二次點選,竟然執行兩次,以後越來越多, 後來檢視文件發現  jquery click  不是 替換原有的function  而是接著新增,所以才

js解決動態事件時不能傳參的問題

問題描述: js使用dom給元素繫結事件時如果直接傳入引數, 會有傳參失敗並且語句會執行並沒有成功繫結事件的情況 舉個例子,假如我們有一個div (id="div1"), 我們想給它繫結一個onclick事件並傳入字串引數: (錯誤案例, 會導致如上後果) var div=doc

JS - 迴圈實現點選轉換CSS類

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>案例</title> <style type="text/css">

關於js中return false、event.preventDefault()和event.stopPropagation()區別以及阻止事件冒泡和阻止預設事件

在平時專案中,如果遇到需要阻止瀏覽器預設行為,大家經常會用return false;和event.preventDefault()來阻止,但對它倆的區別還是模糊,這裡順便帶上event.stopPropagation()一起區分下。 事件處理程式的返回值只對通過屬性註冊的處理程式才有意義,如果我

jQuery中用on事件bind事件的區別

jQuery兩種繫結事件,舉例說明: 以上三種方法都是對ul下的li進行繫結 其中方法一和方法二完全一樣,作用是:給ul下已經存在的li新增繫結事件,方法繫結在了li上,一旦出現新的li,點選方法是無法繫結在新的li上的。 因為繫結方法已經完成,任務分發到各個li上,

vue之選單新增選擇知識:資料雙向、迴圈渲染、事件點選以及按鍵的點選

要求: 1.可以增加菜名 2.可以刪除菜名 3.點選選擇菜名後自動增加到已選選單中 4.可以在已選選單中取消選擇   程式碼: <template> <div> <input type="text" ref="add"> &