1. 程式人生 > >JavaScript 中 當用live繫結多個同名事件時,如何移除事件。

JavaScript 中 當用live繫結多個同名事件時,如何移除事件。

先介紹一下我的問題出現的環境:

公司用的dwz框架,需求是在一個頁面點選,載入一個dialog彈出框,每一個頁面都是一個單獨的jsp檔案:其中在彈出的dialog的那個頁面檔案中,有下面一段程式碼:

因為dwz框架的實現機制,就是把當前的程式碼片段載入到主頁面中,所以想給頁面中的所有checkbox繫結change事件,發現只能用live繫結事件,而用on繫結事件繫結不上:

$('.checkbox_school').live('change', function() {
var schoolInfo = $(this).val();
var schoolInfoObj=eval("("+schoolInfo+")"); //資料字串轉換成物件
if( $(this).attr('checked') && (jQuery.inArray(schoolInfoObj.name,chosenSchoolArr) == -1) ) {
//如果這個input被選中,並且在chosenSchoolArr中沒有它,就把它存入chosenSchoolArr中,把id存入chosenSchoolIdArr中
chosenSchoolArr.push(schoolInfoObj.name);
chosenSchoolIdArr.push(schoolInfoObj.id);
}else if( !($(this).attr('checked')) && (jQuery.inArray(schoolInfoObj.name,chosenSchoolArr) != -1) ){
//如果這個input被取消選中,並且在chosenSchoolArr中有它,從陣列中刪除
chosenSchoolArr.splice(jQuery.inArray(schoolInfoObj.name,chosenSchoolArr),1);
chosenSchoolIdArr.splice(jQuery.inArray(schoolInfoObj.id,chosenSchoolIdArr),1);
}

if(chosenSchoolArr.length >= 3){
$('.input_school').each(function(){
if(!$(this).attr('checked')) {$(this).attr('disabled','true');}
})
}else if(chosenSchoolArr.length < 3){
$('.input_school').each(function(){
$(this).removeAttr('disabled');
})
}

});

以上是背景介紹。

但是在實際的應用中發現原沒有那麼簡單,當我不重新整理頁面而關閉dialog(彈出框)之後,再開啟一次這個dialog(彈出框),程式碼會被再載入一次,也就是說會再一次繫結這個click事件,當我實際對這checkbox進行點選時,這個點選事件會被執行多次,裡面的程式碼會被執行多次,要解決這個問題,只能在儘量不用live繫結事件或者。

之後我想可不可以在每次執行程式碼,繫結事件之前把之前繫結的事件給取消繫結?答案是可行的。於是在偉大的度孃的幫助下,發現可以用die()函式取消之前用live繫結的事件。於是起滿心歡喜地在這個事件之後,加上了一句:$('.checkbox_school').die('click'); 然後執行測試。。。。果然。。。出錯了。

同事說程式設計師不可能寫出沒有bug的程式碼,每天都在創造bug,查詢bug,修復bug中度過。

正當我想要放棄,曲線解決問題時,偶然想到jq中的事件是可以連寫的,我抱著試試看的態度寫了一句:

$('.checkbox_school').die('change').live('change', function() {

//中間程式碼

})

成功了!

哈哈哈哈!

相關推薦

JavaScript live同名事件如何事件

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

C# XML ComboBox

0 繫結第一個ComboBox private void Mxdr_Form_Load(object sender, EventArgs e) { string str = @"Total.xml"; //\bin

jquery bind 方法一個特點(方法到一個dom的某個事件

目錄: [TOC] jquery bind方法介紹 方法宣告:bind(type,[data],fn) 方法說明:為每一個匹配元素的特定事件(eg:click)繫結一個事件處理器函式。這個事件處理函式會通過引數方式接收到一個事件物件,可以通過它來阻止(瀏

關於一個伺服器域名——公司是阿里雲伺服器--是使用tomcat來

我是使用多個tomcat來新增 由於之前已經有一個tomcat,而且上面已經有了一個專案,專案使用的埠號是8080,然而瀏覽器預設的埠號是80,如果將server.xml修改了埠,那之前的專案就會出錯了,所以要繫結域名又不想更改埠號就建立多一個tomcat了 1.將tom

JavaScriptthis物件的

呼叫一個函式將暫停當前函式的執行,傳遞控制權和引數給新函式。除了宣告時定義的形式引數,每個函式接受兩個附加的引數:this和arguments 。引數 this 在面向物件程式設計中非常重要,它的值取決於呼叫的模式。在JavaScript中一共有四種呼叫模式:方法呼叫模式、函式呼叫模式、構造器呼叫模

ButterKnife之三:AdapterButterKnife核心常用功能使用(替代findviewbyid替代OnClickListener以及id監聽事件

在上一篇“ButterKnife之一:Activity中ButterKnife核心常用功能使用(替代findviewbyid,替代OnClickListener以及繫結多個id監聽事件)”中對ButterKnife已經做了相對較詳細的介紹,本篇只對Adapter中ButterKnife使用的程式

ButterKnife之二:Fragment ButterKnife核心常用功能使用(替代findviewbyid替代OnClickListener以及id監聽事件

在上一篇“ButterKnife之一:Activity中ButterKnife核心常用功能使用(替代findviewbyid,替代OnClickListener以及繫結多個id監聽事件)”中對ButterKnife已經做了相對較詳細的介紹,本篇只對Fragment 中ButterKnife使用的

ButterKnife之一:ActivityButterKnife核心常用功能使用(替代findviewbyid替代OnClickListener以及id監聽事件

ButterKnife是一個註解類,ButterKnife開源框架以其強大的view繫結和click事件處理功能,大大減少程式碼量,節省開發時間,提高開發效率,而且ButterKnife在adapter中的使用也方便的處理了adapter中ViewHodler的繫結問題,下面就學習內容做簡單記錄

如何在FineUIMvc(ASP.NET MVC)檢視模型?

起因 這是知識星球內的一個網友提出的,按理說ASP.NET MVC中一個檢視只能繫結一個模型(Model),在檢視頂部標識如下: @model IEnumerable<FineUICore.Examples.Areas.DataModel.Models.Student> 檢視中可

JavaScript如何使addEventListener的函式既能傳參還能解綁?

var btn = document.getElementsByClassName('btn')[0], remove = document.getElementsByClassName('remove')[0]; var some = function (msg) {

【常用】查詢輸入框:一個關鍵字屬性(包括int、string不同的型別)

從input獲取輸入一個待查詢關鍵字key,前端不區分,傳到後臺再進行處理,基本邏輯如下: //根據訂單號(int)或者供應商名稱(string)查詢訂單 if (!string.IsNullOrEmpty(key)) { var Id = MathTools.ToInt(key);

對同一個物件響應事件並都執行和此例子的相容程式碼

要點: 1.因為 onclick=" "  新增的元素響應事件,先新增的事件,會被後來新增的事件層疊掉,只能執行最後一個響應的事件 所以要用到事件監聽addElementLitener()來繫結多個處理函式,而因為相容性的問題需要相容程式碼。 2.在IE8中,addE

一個ip域名

一個ip繫結一個域名 apache伺服器文章中我有介紹apache配置網站,講解一個ip繫結一個域名的步驟和方法。 配置過程: 啟動httpd-vhosts.conf(在httpd.conf檔案中,找到Virtual hosts虛擬主機)

KindEditor、同時富文字編輯器

       var options = { filterMode : false, allowImageUpload : true, items : [

JQuery - on事件

一、jquery為多個選擇器繫結同一個事件 $("#start,#end").on("click",function(){     alert("The paragraph was clicked."); }); 二、多個事件繫結同一個函式 $("p").on("mouseover

如何理解一臺伺服器可以ip一個ip可以域名

一個域名只能對應一個IP的意思是域名在DNS伺服器裡做解析的時候 一條記錄只能指向一個IP地址。這個是死規定,試想一下,如果一個子域名指向了2個ip ,當訪問者開啟這個域名的時候,瀏覽器是展示哪個IP上的網站呢?一個IP可以對於多個域名的意思是:一個IP繫結到一臺伺服器的時候,在伺服器上可以設定多個主機頭,每

【v-on】一個元素事件以及一個事件函式的兩種寫法

本文程式碼主要講述了v-on繫結事件函式傳參,一個元素繫結多個事件的兩種寫法,一個事件繫結多個函式的兩種寫法,修飾符的使用。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8

[樂意黎]Centos設定Nginx反向代理SSL(https)證書詳解

由於微信小程式的緣故,需要SSL服務。 文章用詳解用了兩個免費SSL證書反向代理到一個主機埠上。 第一步:  檢查Nginx是否支援SNI,方式如下     命令:nginx -V     若返回結果中有顯示“TLS SNI

Vue、React同一個dom元素如何點選事件

Vue:<button type="button" @click="a();b()">vue按鈕</button> React:<button type="button

同一個伺服器域名利用Nginx進行域名重定向

背景:同一個伺服器繫結多個域名,利用Nginx進行域名重定向。 首先:tomcat進行部署網站後臺介面,進行重設9090埠(可根據需要自定義,但是注意外網訪問埠,需在阿里雲上配置開放埠)。   Tomcat版本8.044,Nginx版本nginx-1.14.1 Tomcat