2016-03-22 6 views
0

Ich habe das folgende Skript, das ich geschrieben habe.JQuery bedingte preventDefault() feuern, wenn nicht

<script> 
    $(document).ready(function(){ 
     $('a').data('loop',true); 
     $('body').on('click', 'a', function(event){ 
     console.log($(this).data('loop')); 
     if ($(this).data('loop') == 'true') { 
      console.log('hit'); 
      event.preventDefault(); 
      caller = $(this); 
      $(this).data('loop',false); 
      var linkref = $(this).attr('href'); 
      var linkpos = $(this).offset(); 
      var screenwidth = $(window).width(); 
      var json_data = JSON.stringify({linkref: linkref, linkpos: linkpos, screenwidth: screenwidth}); 
      $.ajax({ 
      url: "content/submitcontenthandler?handler=core/_dashboard&method=tracking_ping", 
      method: "POST", 
      data: "json=" + json_data, 
      complete: function (jqXHR, status) { 
       console.log(status); 
       console.log(caller); 
       $(caller).click(); 
      } 
      }); 
     } else { 
      console.log(event.isDefaultPrevented()); 
      console.log('miss'); 
      $(this).data('loop',true); 
     } 
     }); 
    }); 
    </script> 

Es funktioniert, sendet mir die Details, die ich will usw. usw. ABER !!!

Wenn ich auf einen Link klicke, feuert er mir die Details über Ajax ab, dann soll er das Ereignis erneut "klicken", was er tut! aber das Ereignis feuert nicht normal ab. Wenn ich also auf einen Link zu einer anderen Seite klicke, würde ich auf diese andere Seite gehen ... das passiert nicht.

Wenn ich die Zeile auskommentieren event.preventDefault(); Dann das Ereignis ausgelöst wird, wie ich erwarten würde ...

mir So sieht es aus wie das Event.preventDefault selbst ausführt, wenn es nicht gemeint ist während des zweiten Anrufs sein ...

Sorry, wenn dies a etwas kompliziert zu verstehen. Ich verstehe nicht ganz, was selbst passiert. Ist es möglicherweise ein Fehler, oder hat etwas, das ich getan habe, das verursacht?

Ich dachte nicht, dass ich könnte, aber ich habe erfolgreich ein jsfiddle dafür gemacht. https://jsfiddle.net/atg5m6ym/2001/

+2

Sieht so aus, als wäre der Wert, den Sie 'caller' zuweisen, falsch, es sollte' $ (this) 'not' this' sein. –

+0

@KallumTanton Danke, ich habe das Update gemacht. Es funktioniert immer noch genauso (obwohl ich den Unterschied sehen kann zwischen dem, was jetzt ein Objekt ist und was vorher eine Zeichenkette war). Aber es schickt mich immer noch nicht an mein Ziel, wenn ich auf einen Link klicke ... – TolMera

+1

Ich denke, du solltest den erste Anweisung in der "ready" -Funktion – Victor

Antwort

1

Sie können dies versuchen und sich keine Sorgen über die "Schleife" mehr:

$(document).ready(function() { 
    $('body').on('click', 'a', function (event) { 
     event.preventDefault(); 
     var caller = $(this); 
     var linkref = $(this).attr('href'); 
     var linkpos = $(this).offset(); 
     var screenwidth = $(window).width(); 
     var json_data = JSON.stringify({linkref: linkref, linkpos: linkpos, screenwidth: screenwidth}); 
     $.ajax({ 
      url: "content/submitcontenthandler?handler=core/_dashboard&method=tracking_ping", 
      method: "POST", 
      data: "json=" + json_data, 
      complete: function (jqXHR, status) { 
       console.log(status); 
       console.log(caller); 
       window.location.href = linkref; // Redirect happens here 
      } 
     }); 

    }); 
}); 

UPDATE

Es gibt ein paar Probleme hier ist zu beachten:

1) don Einige Links‘ t erfordern eine Umleitung (wie erwähnt, Bootstrap-Modell-Links, die das Anzeigen/Verbergen oder in Dokumentenanker steuern

Um dies zu korrigieren i Es kommt wirklich auf den Fall an.In der Regel fügt Bootstrap den Links bestimmte Klassen oder Datenattribute hinzu, so dass Sie etwas tun können.

$('body').on('click', 'a:not(list of things to exclude)'.. 

Persönlich würde ich stattdessen die Links definiere ich als verfolgen wollte:

<a href=<link> data-tracked='true'... 

<script> 
     $('body').on("click","a[data-tracked='true']"... 

Oder wenn Sie mit wenigen Ausnahmen die meisten Links zu verfolgen, können Sie:

 <a href=<link> data-tracked='false'... 
    <script> 
      $('body').on("click","a:not([data-tracked='false'])"... 

oder allgemeiner:

<script> 
     $('body').on("click","a", function() { 
      if ($(this).attr("data-tracked") == "false" || <you can check more things here>){ 
        return true; //Click passes through 
      } 
      //Rest of the tracking code here 
     }); 
+1

Was ist der Benutzer klickt auf zwei Links nacheinander und Ajax Antwort für die erste noch nicht abgeschlossen; Was wird dann passieren? – itzmukeshy7

+0

Danke! Ziemlich geradlinig ... Ich wundere mich über eine Sache obwohl, wenn der Benutzer einen Link trifft, der nirgendwohin geht. wie für Bootstrap-Modelle oder Anchor-Tags, mit denen Inhalte ein- und ausgeblendet werden oder die tatsächlich als Anker auf der Seite verwendet werden. Würde dies dazu führen, dass die Seite jedes Mal neu geladen wird? – TolMera

+0

Wenn der Benutzer auf einen Link klickt, dann ein anderer und der zweite Ajax nicht fertig ist, macht mir das nichts aus. Ich benutze das nur, um zu verfolgen, wo der Benutzer klickt, ich könnte hier und da ein paar Daten verlieren, aber es sollte ein niedriger Bruchteil über das Ganze sein. – TolMera

1

Die folgende if-Anweisung wahr zurück, wenn das data-loop Attribut eines Element existiert gegen, unabhängig von seinem Wert:

if ($(this).data('loop')) { 

Es muss geändert werden, um den Wert zu überprüfen:

if ($(this).data('loop') == 'true') { 

Wenn Sie etwas zuweisen, um den Wert eines Elementattributs zu erhalten, wird es zu einer Zeichenfolge und benötigt daher einen Zeichenfolgenvergleich.

0

Event.preventDefault() wird nicht zum zweiten Mal ausgeführt.

Linkumleitung findet statt, wenn die Methode abgeschlossen ist. Also in Ihrem Fall wird Umleitung passieren, wenn complete Methode von Ajax Anruf abgeschlossen ist.

nehmen wir an, wir haben event1 und event2 Objekt im Code. event1 ist das Objekt in der Ajax-Aufrufmethode und event2 ist das Ereignisobjekt in der rekursiven Aufrufmethode (Second Call).

Wenn also zum zweiten Mal geklickt wird, haben wir noch complete Methode ausgeführt werden. sobald es zur complete Methode des Ajaxaufrufs zurückkommt, findet es das Ereignis1 hat preventDefault property true und es umadressiert nicht.

+0

Ok Das ist ein bisschen schwierig zu verstehen, aber ich denke, ich habe die Idee. Wenn Sie ein wenig mehr erklären könnten, wäre das großartig! Oder haben Sie vielleicht eine Idee, wie ich es zum Laufen bringen könnte? – TolMera

0

Try t sein;)

$(document).ready(function(){ 
    $('body').on('click', 'a', function(event){ 
    event.preventDefault(); 

    var caller = $(this); 
    var linkref = $(this).attr('href'); 
    var linkpos = $(this).offset(); 
    var screenwidth = $(window).width(); 

    var json_data = JSON.stringify({ 
     linkref: linkref, 
     linkpos: linkpos, 
     screenwidth: screenwidth 
    }); 

    $.ajax({ 
     url: "content/submitcontenthandler?handler=core/_dashboard&method=tracking_ping", 
     method: "POST", 
     /* To temprary block browser; */ 
     async: false, 
     data: "json=" + json_data, 
     complete: function(jqXHR, status){ 
     /* add class **ignore** to a element you don't want to redirect anywhere(tabs, modals, dropdowns, etc); */ 
     if(!caller.hasClass('ignore')){ 
      /* Redirect happens here */ 
      window.location.href = linkref; 
     } 
     } 
    }); 

    }); 
});