目錄
My Page" >My Page
My Other Page" >My Other Page
首頁 web前端 js教程 淺析return false的正確使用_javascript技巧

淺析return false的正確使用_javascript技巧

May 16, 2016 pm 05:17 PM
false return

可能在你剛開始學習關於jQuery事件處理時,看到的第一個例子就是關於如何阻止瀏覽器執行預設行為,例如下面這段示範click事件的程式碼:

複製程式碼 程式碼如下:

$("a.toggle").click(function () { 
$ ( "#mydiv").toggle(); 
    return false; // Prevent browser from visiting `#` 
});

這個函數使用togglediv ,然後阻止瀏覽器繼續存取href中指定的連結。

像上面這樣的例子會讓使用者養成使用「return false」來阻止瀏覽器執行預設行為的壞習慣,在這篇文章裡,我將會討論關於阻止瀏覽器執行預設行為的兩個非常重要的主題:

•選擇正確的方法: return false還是preventDefault,stopPropagation或stopImmediatePropagation
•選擇合適的位置,開始,開始選擇某個地方:你應該在事件回呼的哪個部分取消瀏覽器執行預設行為?

注意:當我在這篇文章中提到event bubbling(事件冒泡),我想表達的是大部分事件都是先在初始DOM上觸發,然後再透過DOM樹往上,在每一級父元素上觸發,事件不會在兄弟節點或是子節點上冒泡(當事件向下冒泡時,我們叫它事件捕捉(event capturing)),你可以在這裡了解更多關於事件起泡和捕捉的介紹。

選出正確的方法

「return false」之所以被誤用的如此厲害,是因為它看起來像是完成了我們交給它的工作,瀏覽器不會再將我們重定向到href中的鏈接,表單也不會被繼續提交,但這麼做到底有什麼不對呢?

」return false「到底做了什麼?

當你每次呼叫」return false「的時候,它實際上做了3件事情:

•event.preventDefault();
•event.stopPropagation();
•停止回呼函數執行並立即傳回。
“等等”,你叫了起來!我只是想讓瀏覽器停止繼續執行預設行為而已,我不需要它去做另外2件事。

這3件事中用來阻止瀏覽器繼續執行預設行為的只有preventDefault,除非你想要停止事件冒泡,否則使用return false會為你的程式碼埋下很大的隱患,讓我們通過一個真實的例子來看看這樣的誤用會造成什麼後果:

這是我們用來示範的HTML:

複製程式碼 程式碼如下:
 

My Page

 
 
    Teaser text... 
 
 
 
 

My Other Page

 
 
    Teaser text... 
 
 
 


現在假設我們想要在使用者點擊文章標題時,將文章動態載入到div.contentd中:

複製程式碼 程式碼如下:
jQuery(document).ready(function ($) { 
  $("div.post h2 a").click(function () { 
    var a    = $(this), 
    href = a.attr('href'), // Let jQuery normalize `href`, 
 . content.load(href " #content"); 
    return false; // "cancel" the default behavior of following the link 
  }); 
}); 



這段程式碼可以正常工作(至少目前是),但如果我們順著這個思路繼續,如果我想要在使用者點擊了一個div.post元素(或任何一個它的子元素)時,給它加上一個active類,我就需要給div.post增加了一個click回調:
複製代碼 程式碼如下:

// Inside Document Ready: 
var posts = $("div.post"); 
  posts.click(function () { 
Remove active from all div.post 
  posts.removeClass("active"); 
  // Add it back to this one 
  $(this).addClass("active"); 
) ; 

現在,如果我們點選一個貼文的標題,這段程式碼會運作嗎?答案是不會,因為我們在標題的click回調裡使用了return false而不是我們應該使用的,」return false「等於event.preventDefault();加event.stopPropagation();,所以事件冒泡就被終止了,click事件不會被冒泡到div.post上,我們為它新增的事件回呼當然也就不會被呼叫了。

如果我們把它和live或delegate事件混在一起使用時,情況就更糟了。

複製程式碼 程式碼如下:

$("a").click(function () { 
  // do something 
  return false; 
}); 

$("a").live("click", function () { 
$("a").live("click", function () {  }); 

那我們真正需要的是什麼呢?

preventDefault()

大多數情況下,當你使用return false時,你其實真正需要的是e.preventDefault()。要使用e.preventDefault,你需要確保你傳遞了event參數到你的回掉函數中(在這個例子裡,就是那個e):

複製程式碼 程式碼如下:

$("a").click(function (e) { 
  // e == our event data
  e. preventDefault(); 
}); 

它會替我們完成所有工作,但不會阻止父節點繼續處理事件,要記住,你放在程式碼中的限制越少,你的程式碼就越靈活,也就越容易維護。

stopPropagation()

但有些情況下,你有可能需要停止事件冒泡,讓我們看看下面的例子:

複製程式碼


代碼如下:

 
    Normal text and then a link and then more text. 
  複製程式碼


程式碼如下:


$("div.post").click(function () { 
  // Do the first thing; 
}); 

$("div.post a").click(function (e) { 
  // Don't cancel the browser's default action 
  // and don't bubble this event! 
  e.stopPropagation();  }); 

}); 

使用return false,div的click事件不會被觸發,但是使用者也不會到達他們點的那個連結。

stopImmediatePropagation() 這個方法會停止一個事件繼續執行,即使當前的物件上還綁定了其它處理函數,所有綁定在一個物件上的事件會按綁定順序執行,看看下面的例子:
複製程式碼 程式碼如下:

$("div a").click(function () { 
  // Do something 
}); 

$("div a").click(function (e) { 
  // Do something else 
  e.stopImmediatePropagation(); 
}); 

$("div a").click(function> // THIS NEVER FIRES 
}); 

$("div").click(function () { 
  // THIS NEVER FIRES 
});
你可能會覺得這個例子看起來很彆扭,沒錯,儘管如此,但有時這的確會發生,如果你的代碼非常複雜,那麼不同的widgets和plugin就有可能在同一個對像上添加事件,如果遇到這種情況,那你就很有必要去理解和使用stopImmediatePropagation。

return false

只有當你同時需要preventDefault和stopPropagation,你的程式碼可以接受直到你的回呼執行完成才停止執行瀏覽器的預設行為,那你就可以使用」return false「。但我強烈建議你別在寫給其它jQuery開發者的演示程式碼中使用這個方法,因為這會造成更多誤用,只有在你確信非用不可的情況下再去使用”return false“。

選擇適當的位置

如果你使用了”return false“,它只會在你的回調函數執行結束才去取消瀏覽器的預設行為,但是使用e.preventDefault,我們有更多的選擇,它可以隨時停止瀏覽器執行預設動作,而不管你將它放在函數的哪個部分。

1. 開發階段,

你應該總是把它放在第一行。你最不想做的事情可能就是你正在調試將一個form改成ajax提交的時候,它卻已經被按照舊方法提交了。

2. 產品階段,

如果你採用了漸進增強(progressive enhancement),那就把它放到回調的結束位置,或者是邏輯終點,如果在一個普通頁面採用漸進增強,那你就需要在伺服器端考慮如果瀏覽器不支援JS時(或被停用時),對連結的click事件和表單的提交事件的處理。這裡的好處是,我們不考慮關閉JS的情況,只考慮支援js時的強狂,如果你的回調程式碼出錯拋出了異常,讓我們看看下面的程式碼:


複製程式碼 程式碼如下:var data = {}; 
$("a").click(function (e ) { 
  e.preventDefault(); // cancel default behavior 
  // Throws an error because `my` is undefined 
  $("body").append("body").append); 🎜>  // The original link doesn't work AND the "cool" 
  // JavaScript has broken. The user is left with NOTHING! 
}); 

現在🎜>現在🎜>我們看看同樣的事件,把preventDefault調用放在底部的效果:



複製代碼
代碼如下:var data = {};  $("a").click(function (e) { 
  // Throws an error because `my` is undefined  // Throws an error because `my` is undefined   "body").append(data.my.link); 

  // This line is never reached, and your website 
  // falls back to using the `href` instead of this 
// "cool" broken JavaScript! 
  e.preventDefault(); // cancel default behavior 
}); 


這對表單提交也同樣有效,你可以更好的應對出錯的情況,別指望你的程式碼一直正常運作,在發生錯誤時有正確的應對總勝過假設程式碼不會出錯。


3.在產品階段,
如果功能這設計JS,那就還應該放在第一行。

記住,不必非得是函數的第一行,但是越早越好,這裡的原則是:如果函數的功能是透過JS實現的(不涉及服務端互動),那就沒必要考慮相容,在這種情況下,添加在第一行可以防止URL中出現#字符,但顯然,你還是應該盡可能多的增加些錯誤處理代碼,以防止用戶在出錯時變得不知所措。

結論

我希望這篇文章傳達的訊息足夠你在需要阻止瀏覽器執行預設行為時做出正確的選擇。記住,只有當你真的明白你在做什麼時,才使用”return false“,並確保你是在函數的正確位置調用了相應的程式碼。最後,盡可能保持程式碼的彈性,盡量不要再用「return false」了!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
C語言return的用法詳解 C語言return的用法詳解 Oct 07, 2023 am 10:58 AM

C語言return的用法有:1、對於傳回值類型為void的函數,可以使用return語句來提前結束函數的執行;2、對於傳回值型別不為void的函數,return語句的作用是將函數的執行結果傳回給呼叫者;3、提前結束函數的執行,在函數內部,我們可以使用return語句來提前結束函數的執行,即使函數並沒有回傳值。

Java中return和finally語句的執行順序是怎樣的? Java中return和finally語句的執行順序是怎樣的? Apr 25, 2023 pm 07:55 PM

原始碼:publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}#輸出上述程式碼的輸出可以簡單地得出結論:return在finally之前執行,我們來看下字節碼層面上發生了什麼事情。下面截取case1方法的部分字節碼,並且對照源碼,將每個指令的含義註釋在

Vue3怎麼使用setup語法糖拒絕寫return Vue3怎麼使用setup語法糖拒絕寫return May 12, 2023 pm 06:34 PM

Vue3.2setup語法糖是在單文件組件(SFC)中使用組合式API的編譯時語法糖解決Vue3.0中setup需要繁瑣將聲明的變量、函數以及import引入的內容通過return向外暴露,才能在使用的問題1.在使用中無需return宣告的變數、函數以及import引入的內容,即可在使用語法糖//import引入的內容import{getToday}from'./utils'//變數constmsg='Hello !'//函數func

使用JavaScript中return關鍵字 使用JavaScript中return關鍵字 Feb 18, 2024 pm 12:45 PM

JavaScript中return的用法,需要具體程式碼範例在JavaScript中,return語句用來指定從函數傳回的值。它不僅可以用於結束函數的執行,還可以將一個值傳回給呼叫函數的地方。 return語句有以下幾個常見的用法:傳回一個值return語句可以用來傳回一個值給呼叫函數的地方。下面是一個簡單的範例:functionadd(a,b){

詳解JavaScript函數傳回值和return語句 詳解JavaScript函數傳回值和return語句 Aug 04, 2022 am 09:46 AM

JavaScript 函數提供兩個介面實現與外界的交互,其中參數作為入口,接收外界資訊;返回值作為出口,並將運算結果回饋給外界。以下這篇文章帶大家了解JavaScript函數回傳值,淺析下return語句的用法,希望對大家有幫助!

JavaScript如何使用return語句 JavaScript如何使用return語句 Feb 26, 2024 am 09:21 AM

JavaScript中return的使用方法,需要具體程式碼範例在JavaScript中,return是一個非常重要的關鍵字,它通常用於函數中傳回值或結束函數的執行。 return語句用來將值傳回給函數的呼叫者,並終止函數的執行。 return語句可以在函數的任何位置使用,並且可以傳回任何JavaScript資料類型,包括數字、字串、布林值、

Python回傳值return怎麼用 Python回傳值return怎麼用 Oct 07, 2023 am 11:10 AM

Python回傳值return用法是當函數執行到return語句時,就會立即停止執行,並將指定的值傳回給呼叫函數的地方。詳細用法:1、傳回單一值;2、傳回多個值;3、傳回空值;4、提前結束函數的執行。

在Java中,一個方法中的return語句執行後,finally區塊會被執行嗎? 在Java中,一個方法中的return語句執行後,finally區塊會被執行嗎? Sep 17, 2023 pm 03:05 PM

是的,即使在方法中的return語句之後,finally區塊也會被執行。 Java中無論是否發生異常,finally區塊都會執行。如果我們在finally區塊中明確呼叫System.exit()方法,那麼只有它不會被執行。很少有情況不會執行finally,例如JVM崩潰、電源故障、軟體崩潰等。除了這些情況外,finally區塊將始終被執行。範例publicclassFinallyBlockAfterReturnTest{  publicstaticvoidmain(St

See all articles