2012-05-04 8 views
6

ist hier ein jsfiddle zeigt mit POJS dass return false; nicht die Veranstaltungs-Ausbreitung nicht zu stoppen: http://jsfiddle.net/Ralt/Lz2Pw/Warum führt die Rückgabe falscher Stopps mit jQuery aus, während dies nicht mit POJS geschieht?

Hier eine weitere mit jQuery zeigt, dass return false;tut die Ausbreitung des Ereignisses zu stoppen: http://jsfiddle.net/Ralt/D5Mtg/

Edit: Die Einer erklärt mir, warum jQuery das - abweichend vom ursprünglichen Verhalten absichtlich - (und wo im Code) die Antwort bekommt. Hier

ist der Code (lang, aber sehr leicht zu lesen):

  • HTML für beide Versionen:

    <div id="parent1"> 
        <div id="child1"><a href="#" id="a1">child1</a></div> 
    </div> 
    
    <div id="parent2"> 
        <div id="child2"><a href="#" id="a2">child2</a></div> 
    </div> 
    
    <div id="parent3"> 
        <div id="child3"><a href="#" id="a3">child3</a></div> 
    </div> 
    
  • POJS:

    document.getElementById('child1').onclick = function(e) { 
        console.log('child1'); 
        e.preventDefault(); 
    }; 
    
    document.getElementById('parent1').onclick = function(e) { 
        console.log('parent1'); 
    }; 
    
    document.getElementById('child2').onclick = function(e) { 
        console.log('child2'); 
        return false; 
    }; 
    
    document.getElementById('parent2').onclick = function(e) { 
        console.log('parent2'); 
    }; 
    
    document.getElementById('child3').onclick = function(e) { 
        console.log('child3'); 
        e.stopPropagation(); 
    }; 
    
    document.getElementById('parent3').onclick = function(e) { 
        console.log('parent3'); 
    }; 
    
  • jQuery-Version :

    $('#child1').click(function(e) { 
        console.log('child1'); 
        e.preventDefault(); 
    }); 
    
    $('#parent1').click(function(e) { 
        console.log('parent1'); 
    }); 
    
    $('#child2').click(function(e) { 
        console.log('child2'); 
        return false; 
    }); 
    
    $('#parent2').click(function(e) { 
        console.log('parent2'); 
    }); 
    
    $('#child3').click(function(e) { 
        console.log('child3'); 
        e.stopPropagation(); 
    }); 
    
    $('#parent3').click(function(e) { 
        console.log('parent3'); 
    }); 
    
+0

Ich frage mich, ob die Rückkehr false wird von jQuery Ereignisbehandlung abgeholt und stoppt die Verbreitung dort ... –

+0

Wenn das so ist, würde ich gerne sehen, wo :-) Auch, warum würde es so tun? –

+0

Ah, das könnte es sein. Gehen Sie zur jQuery-Quelle (http://code.jquery.com/jquery-1.7.2.js), suchen Sie nach "event.stopPropagation", dies geschieht unmittelbar nach einer Bedingungsprüfung, ob ein zurückgegebener Wert false ist. –

Antwort

8

On line 3331 von version 1.7.1, in jQuery.event.dispatch:

ret = ((jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler) 
     .apply(matched.elem, args); 

if (ret !== undefined) { 
    event.result = ret; 
    if (ret === false) { 
     event.preventDefault(); 
     event.stopPropagation(); 
    } 
} 

Viele Verpackungen vor dieser Zeile passiert ist, aber im Grunde genommen, es läuft die Handler-Funktion (entweder eine rohe Funktion oder die handler Memeber-Funktion eines handlerObject) mit apply. Wenn das Ergebnis dieses Aufrufs falsch ist, wird preventDefault und stopPropagation.

Dies wird in der Dokumentation erwähnt für on():

false von einem Event-Handler zurückkehrend automatisch event.stopPropagation() und event.preventDefault() nennen.

Wie für warum haben sie es getan? Ich weiß nicht, wie ich nicht das jQuery-Design-Team bin, aber ich nehme an, es ist nur, weil return false ist viel schneller zu tippen als event.preventDefault(); event.stopPropagation();. (Und wenn jQuery ist nicht darum, dass Sie weniger zu geben, bin ich nicht sicher, was es ist.)

Ich glaube nicht, ist der Rückgabewert von einem Event-Handler tatsächlich verwendet wird immer überall in POJS (jemand richtig, wenn das falsch ist!). Daher kann jQuery sicher eine return-Anweisung verursachen, die Nebenwirkungen in einem Handler verursacht (da die Rückgabe von false in einem POJS-Handler bedeutungslos ist, wird keine POJS-Funktionalität geschädigt).

+0

Warum macht es das? Das ist meine Hauptfrage (aber +1, um genau zu zeigen, wo im Code). –

+1

Heh, ich glaube, ich habe das Motto vergessen. Vielen Dank! –

+3

Weil normalerweise Leute meinen "dieses Ereignis wegwerfen und keine weitere Verarbeitung darauf machen", wenn sie "falsch" zurückkehren; "im Handler. – ThiefMaster

Verwandte Themen