it-swarm.asia

مضيفا onload إلى الجسم

أحاول حاليًا تطوير مكون إضافي من شأنه أن يدمج جولة في Google Earth في WP منشور/صفحة عبر رمز قصير.

المشكلة التي أواجهها هي أنه لكي يتم تحميل الجولة ، يجب أن أضيف onload="init()" إلى علامة <body>.

يمكنني تعديل ملف قالب معين ، ولكن بما أن هذا الإصدار ، فأنا بحاجة إلى إضافته بشكل ديناميكي عبر خطاف. أيه أفكار؟

5
Norcross

فعلت المزيد من الحفر وعثرت على طريقة "أفضل" لإنجازها (تجعل Google من الصعب دمج "جولات Earth لعنة" الخاصة بهم ، ولا تعمل أداتهم).

انتهى بي الأمر بإنشاء البرنامج المساعد الذي يستخدم مزيجًا من الرمز القصير والحقل المخصص.

0
Norcross

وإليك حل مسج (كما اقترح مايك في تعليقه الأول).

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

سيبدأ هذا مسج في أي وضع تعارض (إذا لم يكن بالفعل) وإضافة مكالمة إلى طريقة init() عندما تكون الوثيقة جاهزة. إنها طريقة أكثر أمانًا في الاستخدام من body onready() لأن الدالة onready() يمكنها فقط استدعاء شيء واحد ... لذلك لا يمكن لأي شخص آخر ربط أي شيء بذلك أو إضافة برنامج نصي مخصص. من الأفضل أن تجعل المكون الإضافي غير مزعج بقدر الإمكان حتى لا تتداخل المكونات الإضافية الأخرى أو العكس.

9
EAMann

إليك مقاربة. سوف تضيف add_action() call داخل خطاك ، على ما أعتقد. يفترض جافا سكريبت I أن وظيفة 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 لأنني قمت بتجميعها معًا للإجابة على سؤالك ، لكن هذا يوضح لك على أقل تقدير كيفية إنجاز الحالة العادية ، وبعد ذلك مع بعض اختبارات حالة الاستخدام ، أنا متأكد من أنك ستتمكن من التعامل مع جميع الحالات حالات 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' );

في حالتك ، يمكنك فقط استبدال my_onload_callbacks بأسلوب init الخاص بك.

1
Annika Backstrom