2013-02-13 5 views
7

Ich mache ein TD Element der Tabelle editierbar auf Doppelklick:Deaktivieren Sie vorübergehend alle derzeit aktiven jQuery Event-Handler

$(document).on("dblclick", "#table>tbody>tr>td.cell", function(e) { 
    if (e.which != 1 || e.shiftKey || e.altKey || e.ctrlKey) 
     // need left button without keyboard modifiers 
     return; 
    reset_selection(); 
    var editor = document.createElement("div"); 
    editor.setAttribute("contenteditable", "true"); 
    editor.innerHTML = this.innerHTML; 
    this.innerHTML = ''; 
    // this.style.padding = 0; 
    this.appendChild(editor); 
    $(document).on("*", stub); 
    editor.onblur = function() { 
     // this.parentNode.setAttribute("style", ""); 
     this.parentNode.innerHTML = this.innerHTML; 
     sys.editor = null; 
     $(document).off("*", stub);; 
    }; 
    editor.focus(); 
}); 

function stub(e) { 
    e.stopImmediatePropagation(); 
    return false; 
} 

Aber wenn ich auf den Text innerhalb des editierbaren div klicken verdoppeln, die Doppelklick-Ereignis propagiert zu das Elternteil verursacht unerwünschte Folgen. Es gibt auch andere Ereignisse (select, mousedown, etc), die ich verhindern möchte, also ein Stub für jeden von ihnen zu schreiben, sieht nicht nett zu mir aus.

enter image description here

Gibt es einen Weg, um alle derzeit aktiven jQuery Event-Handler zu deaktivieren und sie anschließend aktivieren? Oder irgendjemand hört auf, alle Ereignisse vom editierbaren Div zu seinen Eltern zu propagieren?

Antwort

10

Oder irgendjemand stoppt die Weiterleitung aller Ereignisse von der bearbeitbaren Div zu seinen Eltern?

Es kann nicht sehr schmackhaft sein, aber es ist nicht dass schlecht, um speziell die Ereignisse zu deaktivieren:

$(this).on("select mousedown mouseup dblclick etc", false); 

(. this Unter der Annahme, bezieht sich auf die Zelle, die Sie gerade bearbeiten)

Schließlich gibt es eine begrenzte Anzahl von Ereignissen, und on ermöglicht es Ihnen, sie in einer durch Leerzeichen getrennten Zeichenfolge aufzulisten und sie zu deaktivieren, indem Sie false übergeben.

Sie können sie dann wieder aktivieren, indem Sie die gleiche Liste und false erneut in off übergeben.

+0

Was ist, wenn einer der Eltern von 'td' auch einige Handler hat? Habe ich auch einen Stummel für jeden von ihnen gemacht? – warvariuc

+0

@warwaruk: Keine Notwendigkeit, 'false' stoppt die Verbreitung. –

+0

Ich habe '

#
'. 'this' ist das 'td':' $ (this) .on ("selectstart mousedown mouseup dblclick", false); 'schaltet Events nicht nur für' td' aus, sondern auch für sein Kind 'div', also kann ich nicht auswählen Text in der div, kann nicht doppelklicken, um Wörter usw. zu wählen – warvariuc

4

Verwendung Ein/Aus JQuery Methoden:

var myFunction = function(e) { 
     if (e.which != 1 || e.shiftKey || e.altKey || e.ctrlKey) 
      // need left button without keyboard modifiers 
      return; 
     reset_selection(); 
     var editor = document.createElement("div"); 
     editor.setAttribute("contenteditable", "true"); 
     editor.innerHTML = this.innerHTML; 
     this.innerHTML = ''; 
     // this.style.padding = 0; 
     this.appendChild(editor); 
     $(document).on("*", stub); 
     editor.onblur = function() { 
      // this.parentNode.setAttribute("style", ""); 
      this.parentNode.innerHTML = this.innerHTML; 
      sys.editor = null; 
      $(document).off("*", stub);; 
     }; 
     editor.focus(); 
}; 

function stub(e) { 
    e.stopImmediatePropagation(); 
    return false; 
} 

//Active the events 
$(document).on("dblclick", "#table>tbody>tr>td.cell", myFunction); 

//Disable the events 
$(document).off("dblclick", "#table>tbody>tr>td.cell",myFunction); 

//Reactive the events 
$(document).on("dblclick", "#table>tbody>tr>td.cell", myFunction); 

aktualisieren

Sie können auch eine Variable auf true verwalten, wenn das Ereignis nicht berücksichtigt werden müssen:

var skipEvent = true; 

$(document).on("dblclick", "#table>tbody>tr>td.cell", function (e) { 
    //Check variable and skip if true 
    if (skipEvent) 
     return false; 

    if (e.which != 1 || e.shiftKey || e.altKey || e.ctrlKey) 
    // need left button without keyboard modifiers 
    return; 
    reset_selection(); 
    var editor = document.createElement("div"); 
    editor.setAttribute("contenteditable", "true"); 
    editor.innerHTML = this.innerHTML; 
    this.innerHTML = ''; 
    // this.style.padding = 0; 
    this.appendChild(editor); 
    $(document).on("*", stub); 
    editor.onblur = function() { 
     // this.parentNode.setAttribute("style", ""); 
     this.parentNode.innerHTML = this.innerHTML; 
     sys.editor = null; 
     $(document).off("*", stub);; 
    }; 
    editor.focus(); 
});   
+1

Ich schrieb in der Frage: "Es gibt auch andere Ereignisse (select, mousedown, etc), die ich verhindern will, so ein Stub für jeden von ihnen zu schreiben, sieht nicht nett zu mir aus." – warvariuc

+0

Sie können auch eine Variable verwalten, die auf "True" gesetzt ist, wenn das Ereignis nicht berücksichtigt werden muss. Überprüfen Sie meine letzte Aktualisierung. – sdespont

Verwandte Themen