it-swarm.cn

将onload添加到body

我目前正在尝试开发一个插件,通过短代码将Google Earth Tour嵌入WP帖子/页面。

我遇到的问题是,为了加载游览,我必须在<body>标记中添加onload="init()"

我可以修改一个特定的模板文件,但由于这是发布版本,我需要通过钩子动态添加它。有任何想法吗?

5
Norcross

进行了一些挖掘并找到了一种“更好”的方法来让它发挥作用(谷歌很难让他们该死的地球之旅嵌入,他们的小工具不起作用)。

我最终制作了一个 插件 它使用短代码和自定义字段的组合。

0
Norcross

这是一个jQuery解决方案(正如Mike在他的第一条评论中所建议的那样)。

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

然后在插件中添加一个脚本来执行此操作:

jQuery.noConflict();

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

这将在没有冲突模式下启动jQuery(如果它还没有),并在文档准备好时添加对init()方法的调用。使用它比body onready()更安全,因为onready()函数只能调用一个东西......所以没有其他人可以挂钩任何东西或添加自定义脚本。最好让插件尽可能不引人注目,这样其他插件就不会干扰,反之亦然。

9
EAMann

这是一种方法。我相信你会在你的钩子里添加add_action()调用。我包含的JavaScript假定已经定义了init函数。如果没有,那么这将失败,但是如果我理解你的话,包括脚本似乎是你已经解决的问题。请注意,您不一定需要将其添加到wp_foot,您可以轻松地将其添加到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

忽略使用jQuery执行此操作的可能性您可以做的一件事是 挂钩template_include过滤器并使用ob_start()回调。然后你的回调可以在'<body'上进行字符串搜索,并用'<body onload="init()"'替换它,就像下面的代码一样。您应该可以直接将它放在插件中,只需确保更改名称以遵循插件自己的命名约定:

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

请注意,如果我是你,我不会认为上面的代码是完全健壮的。我怀疑它会处理所有Edge的情况,因为我只是把它放在一起回答你的问题,但最低限度它告诉你如何完成正常的情况,然后通过一些用例测试我相信你会得到它来处理所有重要的边缘情况(如果'<BODY'是大写的,等等?)

2
MikeSchinkel

这里有一些JavaScript动态添加回调到页面加载,有或没有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' );

在您的情况下,您只需用您的init方法替换my_onload_callbacks。

1
Annika Backstrom