我不想成为一个lazy dev. 因此,我只想在需要的地方包含我的js文件。
由于在使用我的短代码的任何地方都需要js,所以我试着去做回答here.
i、 e.:
js公司
function do_cool_stuff(){
//do the most awesomest of stuff
//..ok mostly changes textvalues dynamically
}
php
function enqueueAllMyStuff(){
\\wp_enqueue_script(\'my_stuff\',path_to_my_stuff);
\\wp_localize_script(\'my_stuff\',\'jabba_the_slug\',[\'url\'=>\\admin_url(\'admin-ajax.php\')];
//...
}
\\add_shortcode(\'goodName\',__NAMESPACE__.\'\\\\my_shortcode\')
function my_shortcode(){
enqueueAllMyStuff();
return \'<script>do_cool_stuff()</script>\';
}
但这并不奏效。因为“do\\u cool\\u stuff is not defined”。已尝试执行
return \'<img src="\'.admin_url().\'/images/loading.gif" onload="do_cool_stuff()"/>\';
这种方法有时效果很好。暗示这是一个种族条件。
function my_shortcode(){
\\add_action(\'wp_enqueue_scripts\',__NAMESPACE__.\'\\\\enqueueAllMYStuff\');
return \'<script>do_cool_stuff()</script>\';
}
也不起作用,因为标头已发送。
所以应该有更好的方法来做到这一点。
最合适的回答,由SO网友:Jacob Peattie 整理而成
如果你跑步wp_enqueue_script()
在一个短代码中,这基本上就是您通过调用enqueueAllMyStuff()
, 脚本将排队以加载到页脚中。因此,如果您的短代码在打印后立即运行脚本,则它所依赖的JavaScript文件将不可用,并将导致此错误。
最简单的解决方案是更新脚本,等待加载文档。使用jQueryjQuery( document ).ready()
, 但在vanilla JS中,您可以使用:
<script>
window.addEventListener( \'DOMContentLoaded\', function() {
do_cool_stuff();
} );
</script>