Seite neu laden, bevor AJAX-Anforderungsbeendigungen

Ich arbeite an einem WP-Plugin, und ich muss in der Lage sein, eine URL (speziell eine AJAX-function) mit einem Klick auf die Schaltfläche aufzurufen, aber die Seite aktualisiert nach dem Klicken, was verhindert, dass die AJAX-Anfrage beendet wird.

Wenn der Button-Klick registriert wird, soll JS den Wert einer Eingabe erfassen, zu einer URL kombinieren und dann eine iFrame-Quelle zu dieser URL (von der ich es anrufe) ändern, aber dies wird durch die Aktualisierung der URL widerlegt Seite.

Code ist unten:

$intro = get_post_meta($post -> ID, $key = 'podcast_file', true); ?> 

Download post_title ?> ()

<a href="https://wordpress.stackexchange.com/questions/229755/page-reloads-before-ajax-request-finishes/" download="" class="demoBtn">Download for PC <!--Demo-->
(We do NOT collect email addresses.) jQuery(document).ready(function($){ $("#UniqueLevelEmailButton").click(function(e){ email = document.getElementById('emailValue').value; downloadurl = '?action=download_email_send&postId=ID; ?>&emailValue='+email; document.getElementById('emailsendframe').src = downloadurl; return false; }); return false; });
post_title; // ! you would need to redefine $intro here ! $intro = get_post_meta($post_id, $key = 'podcast_file', true); $path = str_replace("http://example.com/wp-content","",$intro); $subject = 'Download for '.$postName; $msg = 'Your download for '.$postName.' ('.basename($intro).') is attached to this email.'; //Why am I unable to pass HTML in the message? $headers = 'From: Example ' . "\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; $mail_attachment = array(WP_CONTENT_DIR . $path); $send = wp_mail($to, $subject, $msg, $headers, $mail_attachment); if ($send) {$message = 'Success! Your download has been sent to your email address.';} else {$message = 'Error: Mail sending failed. Please contact the website administrator using the contact page.';} // } // alert the user to the result echo "alert('".$message."');"; exit; }

Solutions Collecting From Web of "Seite neu laden, bevor AJAX-Anforderungsbeendigungen"

Bitte bringen Sie diesen Code nicht in Produktion

OK. Es gibt also viele Dinge, die mit dem Code, der repariert werden muss, nicht stimmen, bevor wir überhaupt anfangen können, Ihre Frage zu beantworten.

  1. Erstens verwenden wir $_REQUEST ohne guten Grund – $_REQUEST gibt uns Zugriff auf alle in der Anfrage gesendeten Informationen, was bedeutet, dass $_POST['foo'] $_REQUEST['foo'] === $_GET['foo'] und auch $_COOKIE['foo'] ! Das bedeutet, dass wir IDs von Ihrer Anwendung anfordern können, indem Sie einfach ein Cookie lokal setzen.

  2. Zweitens nehmen wir $post_id und machen das damit:

    $ post_id = $ _REQUEST [‘Post-ID’]; … $ page = get_post ($ post_id);

Das heißt, sobald wir den Code für [get_post](https://developer.wordpress.org/reference/functions/get_post/) überprüft haben und feststellen, dass er keine Zugriffsrechte mehr überprüft, bedeutet dies, dass Sie jetzt zulassen Benutzer (den Sie nicht kennen), um einen einzelnen “Beitrag” zu erhalten, den Sie auf Ihrer Website haben. Da WordPress alle Post-ähnlichen Objekte in der Tabelle wp_posts , bedeutet dies, dass wenn Sie WordPress-Post-Typen für jede Art von geschützten Informationen verwenden, der Benutzer in der Lage ist, auf diese Informationen zuzugreifen (theoretisch), indem Sie ihn anfordern.

  1. Drittens übergeben wir eine ungefilterte Variable in eine function a la $intro = get_post_meta($post_id, $key = 'podcast_file', true); – Zum Glück filtert WordPress diese Eingabe für uns

  2. Viertens senden wir dann den Rückgabewert von diesem unkontrolliert , um eine andere Variable zu erzeugen $path = str_replace("http://com.areonline.co.uk/wp-content","",$intro);

  3. Fünftens verwenden wir dann diese Variable ( $path ) und senden sie als Anhang an den Absender.


Ansonsten versuchen Sie, Ihre Anfrage mit jQuery.post zu senden und auch lokalisierte Variablen mit Localize Script zu erstellen und (um die Frage zu beantworten) auch event.preventDefault() für alles zu verwenden, was nicht passieren soll.

In diesem Fall:

 $("#UniqueLevelEmailButton").click(function(e){ e.preventDefault(); // blah } 

Ich kann die Gültigkeit des AJAX-Aufrufs nicht kommentieren; Es ist ein anderer Stil als ich verwendet habe – aber innerhalb des click(function(e) { code) könnten Sie versuchen, die Standard-Seitenaktion einzufangen, um zu verhindern, dass sie die Seitenaktualisierung austriggers:

  $("#myelement).click(function(e){ e.preventDefault();