it-swarm-es.com

Añadiendo onload al cuerpo

Actualmente estoy intentando desarrollar un complemento que incrustará un tour de Google Earth en una publicación/página WP a través de un código corto.

El problema con el que me estoy topando es que para que se cargue el tour, debo agregar una onload="init()" en la etiqueta <body>.

Puedo modificar un archivo de plantilla específico, pero como esto es para lanzamiento, necesito agregarlo dinámicamente a través de un enlace. ¿Algunas ideas?

5
Norcross

Hicimos un poco más de investigación y encontré una "mejor" manera de hacerlo funcionar (Google hace que sea difícil incrustar sus malditos Earth Tours y su dispositivo no funciona).

Terminé haciendo un plugin que usa una combinación de un shortcode y un campo personalizado.

0
Norcross

Y aquí hay una solución jQuery (como Mike sugirió en su primer comentario).

function add_my_scripts() {
    wp_enqueue_script('jquery');
    wp_enqueue_script('my_init_script', SCRIPTSRC, 'jquery', '1.0');
}
add_action('init', 'add_my_scripts');

Luego, agregue un script a su complemento que haga esto:

jQuery.noConflict();

jQuery(document).ready(function($) {
    init();
}

Esto iniciará jQuery en modo sin conflicto (si no lo está ya) y agregará una llamada al método init() cuando el documento esté listo. Es un método más seguro de usar que body onready() porque la función onready() solo puede llamar a una cosa ... así que nadie más puede enganchar nada a eso o agregar un script personalizado. Es mejor hacer que su complemento sea lo más discreto posible para que otros complementos no interfieran o viceversa.

9
EAMann

Aquí hay un enfoque. Deberías agregar la llamada add_action() dentro de tu gancho, creo. El JavaScript que incluyo presume que la función init ya ha sido definida. Si no lo ha hecho, entonces esto fallará, pero incluir el script parece ser un problema que ya resolviste si te entiendo bien. Tenga en cuenta que no necesariamente tiene que agregarlo a wp_foot, simplemente podría agregarlo a wp_head:

<?php

function mypluginprefix_onload_init() { ?>
<script language="text/javascript">
// check for the standards-compliant way to add onload events
if ( typeof(window.addEventListener) !== 'undefined' )
    window.addEventListener( "load", init, false );
// or the older msie nonstandard way
else if ( typeof(window.attachEvent) !== 'undefined' ) {
    window.attachEvent( "onload", init );
}
</script>
<?php }

// this goes in your hook
add_action('wp_foot', 'mypluginprefix_onload_event');
?>
4
artlung

Si ignora el potencial de hacer esto con jQuery, una cosa que podría hacer es enganchar el filtro template_include y usar ob_start()con una devolución de llamada. Su devolución de llamada puede hacer una búsqueda de cadena en '<body' y reemplazarla con '<body onload="init()"' como lo hace el siguiente código. Debería poder colocarlo directamente en su complemento, solo asegúrese de cambiar los nombres para seguir la convención de nomenclatura de su propio complemento:

<?php
add_filter('template_include','start_buffer_capture',1);
function start_buffer_capture($template) {
  ob_start('end_buffer_capture');  // Start Page Buffer
  return $template;
}
function end_buffer_capture($buffer) {
  return str_replace('<body','<body onload="init()"',$buffer);
}

Tenga en cuenta que no asumiría que el código anterior sea completamente sólido aún si fuera usted. Dudo que manejará todos los casos de Edge ya que lo junté para responder a tu pregunta, pero como mínimo te muestra cómo llevar a cabo el caso normal, y luego, con algunas pruebas de casos de uso, estoy seguro de que lo manejarás todo. los casos importantes de Edge (como ¿qué sucede si '<BODY' está en mayúsculas, etc.?)

2
MikeSchinkel

Aquí hay algunos JavaScript para agregar dinámicamente una devolución de llamada a la carga de la página, con o sin jQuery:

function add_onload() {
    ?>
    <script type="text/javascript">
    my_onload_callback = function() { alert('Hello!'); }; // test function

    if( typeof jQuery == "function" ) { 
        jQuery(my_onload_callback); // document.ready
    } else {
        document.getElementsByTagName('body')[0].onload = my_onload_callback; // body.onload
    }
    </script>
    <?php
}
add_action( 'wp_footer', 'add_onload' );

En su caso, simplemente reemplazaría my_onload_callbacks con su método init.

1
Annika Backstrom