it-swarm.asia

كيف يمكنني تشغيل وظيفة جافا سكريبت عند اكتمال Drupal ajax؟

أحتاج إلى القيام ببعض الأشياء الإضافية بعد Drupal تم الانتهاء من إدخال بعض الأشياء في DOM. مع jQuery كان هذا بسيطًا للغاية ، ولكن لا يمكنني طوال حياتي معرفة كيف للقيام بذلك في Drupal 7: s

هل أضيف شيئًا إلى الرابط المتصل؟ قرأت شيئًا عن إرفاق السلوك ... بدأ الارتباك ...

7
SomethingOn

انتهى بي الأمر بإضافة بعض أوامر الإضافات إلى الصفحة التي يتم إرجاعها بواسطة معالج ajax مثل هذا:

$commands = array();
$commands[] = ajax_command_invoke(NULL, 'grid_content_loading', array('argument1', 'argument2'));
$commands[] = ajax_command_append('#grid-content-target', $html);
$commands[] = ajax_command_invoke(NULL, 'grid_content_loaded', array('argument1', 'argument2'));
$page = array('#type' => 'ajax', '#commands' => $commands);
ajax_deliver($page);

وعلى جانب العميل ، قمت بإنشاء وظيفتين لجافا سكريبت من خلال jQuery:

(function($) {
$.fn.grid_content_loading = function($argument1, $argument2) {
   ...
};

$.fn.grid_content_loaded = function($argument1, $argument2) {
   ...
};
})(jQuery);
6
SomethingOn

في مشروعي ، قمت بالفعل بكتابة كود JavaScript محدد جيدًا قام بتحديث إحصائيات الصفحة بعد استدعاء AJAX.

نظرًا لأنني أردت إعادة استخدام الوظائف دون الانتقال إلى حد "توسيع jQuery" ، فقد انتهيت بالحل التالي ، باستخدام وظيفة jQuery الحالية ، بدلاً من تحديد واحدة جديدة. تم استلهام ذلك من ما تفعله وحدة "الأعلام" - فهو ببساطة يُطلق حدثًا ، ويسمح للعديد من مستمعي أحداث جافا سكريبت بالتصرف كرد فعل ، على عكس وجود مكون إضافي/ملحق jQuery مخصص ومشفّر كما هو الحال في الحل استكشافها في الإجابات السابقة.

في Drupal الوحدة:

// in_some_ajax_function()

$commands[] = ajax_command_invoke('html', 'trigger', array('MY_EVENT'));

في جافا سكريبت:

// Added an event binding to my $(document).ready();

$(document).ready(function(){

  $(document).bind('MY_EVENT', function() {
    alert('MY_EVENT');
  });

});

كان علي أن أشير إلى أن المعلمة الأولى لـ ajax_command_invoke هي عدم استخدام أي كائنات جافا سكريبت أصلية أبدًا ، لذلك لا يعمل ما يلي أبدًا ، لأنه يترجم إلى محدد 'مستند' (عنصر):

// This tries to select $('document')
// ... which is nothing, since there are no 'document' elements.

$commands[] = ajax_command_invoke('document', 'trigger', array('MY_EVENT'));

الغريب أن التوافق على $(document) والتشغيل على $('html') متوافقين. أفترض أنه يمكنك أن تصبح مبدعًا جدًا ، وأن تربط/تحفز على عناصر أكثر تحديدًا وأعمق. إذا كان بإمكانك التفكير في سيناريو يجعل القيام بذلك أكثر منطقية من تشغيل حدث عالي المستوى ، فيرجى التعليق!

3
starlocke

أعتقد أن أفضل خيار هو استخدام الوظيفة jQuery ajaxComplete:

(function($){ 
   $(document).ajaxComplete(function(e, xhr, settings)
   {
     alert(settings.url);
   });
}(jQuery));

وإذا كنت تريد استخدام الوظيفة لوظيفة ajax محددة ، فيمكنك استخدام الإعدادات المحددة .url لمجالك وتغيير ذلك إلى:

(function($) {
    $(document).ajaxComplete(function(e, xhr, settings){ 
    if (settings.url == "the path from step 1") {
        // Code to populate your fields here
    }
 });
}(jQuery));

هذا عمل لي من أجل Drupal 7 and 8.

2
valdeci

نموذج التعليمات البرمجية:

$commands = array();
$commands[] = array(
    'command' => 'your_js_callback', // the name of your javascript callback
    'value1'  => 'My first value',
    'value2'  => 'My second value',
);
ajax_render($commands);

كود شبيبة:

(function($, Drupal) {
    Drupal.ajax.prototype.commands.your_js_callback = function(ajax, response, status) {
        alert(response.value1);
        alert(response.value2);
    }
})(jQuery, Drupal);
1
Muhammad Reda

لقد نشرت إجابة على هذا السؤال على ذلك

https://stackoverflow.com/a/19404566/894487

لست متأكدا من الاختلافات الحقيقية بين تمديد Drupal.ajax.prototype.commands أو $.fn

أتصور أن الأول سيكون أكثر كفاءة لأنه لا يتطلب اجتياز دوم للوصول إلى وظيفتك. لست متأكدا إذا كان ذلك مهما.

0
ErichBSchulz

لقد كتبت برنامجًا تعليميًا حول كيفية القيام بذلك في Drupal 7: https://www.jaypan.com/tutorial/calling-function-after-ajax-event-drupal- 7

0
Jaypan

حل الاختراق السريع: ضع صورة داخل المحتوى الذي تم تحميله وأعطه السمة onload="[javascript function]()". لست متأكدًا أن هذا هو ما تبحث عنه بالفعل ... أو إذا كان هذا أسهل من الطريقة الصحيحة ... ولكن ربما أفضل من لا شيء؟

0
Kirk Twist