it-swarm-id.com

Tetap onload ke tubuh

Saat ini saya mencoba mengembangkan plugin yang akan menyematkan Google Earth Tour ke dalam post/halaman WP melalui kode pendek.

Masalah yang saya hadapi adalah bahwa untuk tur dimuat, saya harus menambahkan onload="init()" ke tag <body>.

Saya dapat memodifikasi file templat tertentu, tetapi karena ini untuk rilis, saya perlu menambahkannya secara dinamis melalui sebuah kail. Ada ide?

5
Norcross

Melakukan penggalian lebih lanjut dan menemukan cara 'yang lebih baik' untuk membuatnya berfungsi (Google menyulitkan Earth Earth mereka yang tertanam, dan gadget mereka tidak berfungsi).

Saya akhirnya membuat plugin yang menggunakan kombinasi kode pendek dan bidang khusus.

0
Norcross

Dan inilah solusi jQuery (seperti yang disarankan Mike dalam komentar pertamanya).

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

Kemudian tambahkan skrip ke plug-in Anda yang melakukan ini:

jQuery.noConflict();

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

Ini akan memulai jQuery dalam mode tanpa konflik (jika belum) dan menambahkan panggilan ke metode init() ketika dokumen siap. Ini adalah metode yang lebih aman untuk digunakan daripada body onready() karena fungsi onready() hanya dapat memanggil satu hal ... jadi tidak ada orang lain yang dapat menghubungkan apa pun dengan itu atau menambahkan skrip khusus. Lebih baik membuat plug-in Anda tidak mengganggu mungkin sehingga plug-in lainnya tidak mengganggu atau sebaliknya.

9
EAMann

Inilah pendekatannya. Anda akan menambahkan panggilan add_action() di dalam hook Anda, saya percaya. JavaScript yang saya sertakan mengandaikan bahwa fungsi init telah didefinisikan. Jika belum, maka ini akan gagal, tetapi termasuk skrip sepertinya masalah yang sudah Anda pecahkan jika saya mengerti Anda dengan benar. Perhatikan bahwa Anda tidak perlu menambahkannya ke wp_foot, Anda bisa dengan mudah menambahkannya ke 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

Mengabaikan potensi untuk melakukan ini dengan jQuery satu hal yang dapat Anda lakukan adalah kaitkan filter template_include dan gunakan ob_start()dengan panggilan balik. Callback Anda kemudian dapat melakukan pencarian string pada '<body' dan menggantinya dengan '<body onload="init()"' seperti kode berikut. Anda harus bisa menjatuhkannya langsung di plugin Anda, pastikan untuk mengubah nama untuk mengikuti konvensi penamaan plugin Anda sendiri:

<?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);
}

Perhatikan bahwa saya tidak akan menganggap kode di atas sepenuhnya kuat jika saya adalah Anda. Saya ragu itu akan menangani semua kasus Edge karena saya baru saja melemparkannya bersama-sama untuk menjawab pertanyaan Anda tetapi minimal itu menunjukkan kepada Anda bagaimana menyelesaikan kasing normal, dan kemudian dengan beberapa pengujian case-use saya yakin Anda sudah mendapatkannya untuk menangani semua kasus Tepi penting (seperti bagaimana jika '<BODY' adalah huruf besar, dll?)

2
MikeSchinkel

Berikut ini beberapa JavaScript untuk secara dinamis menambahkan panggilan balik ke halaman yang dimuat, dengan atau tanpa 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' );

Dalam kasus Anda, Anda hanya akan mengganti my_onload_callbacks dengan metode init Anda.

1
Annika Backstrom