it-swarm-eu.dev

Dove prendere l'evento Post?

Uso il seguente JavaScript per aprire una nuova finestra in cui è visualizzata la pagina di accesso di Joomla:

window.open('https://URL', '_blank', 'location=yes');

La nuova finestra si apre è la seguente:

enter image description here

Ho bisogno di popolare automaticamente il nome utente nel suo campo. Ho trovato il metodo postMessage () molto adatto per le comunicazioni tra domini (ad esempio, questo esempio ). Quindi ho modificato il mio JavaScript in questo modo:

var loginWindow = window.open('https://URL', '_blank', 'location=yes');
loginWindow.postMessage('username', 'foobar');

Per quanto riguarda la ricezione, (Joomla), devo aggiungere questo codice per catturare il messaggio postale:

window.addEventListener('message', function(event) {
  var message = event.data;
  $('input.login').val(message);
});

La mia domanda è: dove posso aggiungere questo codice?
Non ho familiarità con la struttura di Joomla e non ho visto JavaScript nei file come il modulo di login (componenti/com_users/views/login/tmpl/default_login.php). Quindi, dove posso aggiungere questo codice JavaScript. Se non posso, quali alternative ho?

Update
Sulla base dei consigli di @Rene Korss, ho aggiunto il mio codice alla fine del seguente file /templates/theme718/html/com_users/login/default_login.php Cito parte del codice precedente nel file per mostrarne la natura. Il mio codice inizia da <?php

<script>
......
if(jQuery( window ).height()<620){
    jQuery('#copy-rightfp').addClass("copy-rightfps");
} else {
    jQuery('#copy-rightfp').removeClass("copy-rightfps");
}

function alertforget(){

    var div = '<div class="green"><p><?php echo JText::_('COM_FORGET_OOPS') ?></p></div><div class="font12"><p><?php echo JText::_('COM_FORGET_PLEASE_CALL') ?></p></div>';

    jQuery('#msgcontainer .note').html('');
    jQuery('#msgcontainer .note').append(div);

    jQuery('#msgcontainer').bPopup({
            modalClose: false,
            opacity: 0,
            positionStyle: 'fixed'
    });
}


<?php
$document = JFactory::getDocument();

$document->addScriptDeclaration("
    window.addEventListener('message', function(event) {
      var message = event.data;
      $('input#username').val(message);
    });
");
?>

</script>

Trovo che l'elemento in cui voglio popolare il messaggio sia chiamato username, dal basso:

enter image description here

Tuttavia, quando si apre la finestra, non si verifica nulla. Nessun errore visualizzato nella console

3
Hawk

Vorrei ignorare Joomla! vista di accesso.

Copia il contenuto di

components/com_users/views/login/tmpl/default_login.php

e crea un nuovo file .php in

YOUR_TEMPLATE_NAME/html/com_users/login/default_login.php

e incolla lì i contenuti copiati.

Vedi Joomla! documenti per Come sovrascrivere l'output dal core di Joomla! .

Quindi aggiungi il file javascript o il javascript incorporato per iniziare il file sovrascritto.

JS in linea (aggiunge il codice tra i tag <head></head>)

<?php
$document = JFactory::getDocument();
$document->addScriptDeclaration("
    window.addEventListener('message', function(event) {
      var message = event.data;
      $('input.login').val(message);
    });
");
?>

OR

JS esterno

<?php
    $document = JFactory::getDocument();
    $document->addScript('/wherever/your/js/file.js');
?>

È possibile aggiungere questo file JS alla cartella del modello o dove preferisci. E aggiungi il tuo codice al file JS.

Vedi Joomla! documenti per aggiunta di JavaScript .

EDIT:

Stai usando il metodo postMessage() in modo errato. Secondo MDN devi specificare targetOrigin, che è il secondo argomento.

Se nel momento in cui l'evento è programmato per essere spedito, lo schema, il nome host o la porta del documento di altra finestra non corrisponde a quello fornito in targetOrigin, l'evento non verrà inviato; solo se tutte e tre le partite saranno inviate all'evento.

Attualmente è foobar. Quindi non c'è corrispondenza e l'evento non verrà spedito. Modifica il tuo codice in questo (sostituisci Origin).

loginWindow.postMessage('username_value_here', 'http://example.com');

MODIFICA 2

Poiché il codice stava inviando postMessage subito dopo l'apertura del popup, lo ha inviato troppo presto. La destinazione non è stata ancora caricata.

Quindi abbiamo finito con questo codice:

Lato destinazione

/**
 * Ask for username from opener
 */

window.onload = function(){ 
    window.opener.postMessage('giveMeUsername', '*'); 
};

/**
 * Event to catch opener messages
 */

window.addEventListener('message', function(event) {
    // Allow only wanted domain
    if(event.Origin !== 'http://example.com') return;
    var message = event.data;
    jQuery('input#username').val(message);
}, false);

Lato apri

/**
 * Send username to popup, if it asks
 */
window.addEventListener('message', function(event) {
    var message = event.data;

    // If popup asks for username
    if(message == 'giveMeUsername'){
        loginWindow.postMessage('username_value', '*');
    }
}, false);
5
Rene Korss