Robiłem wiele postów na drupal.org na ten temat, ale niestety w niewłaściwym kontekście.
- Ajaxed content nie dołącza potrzebnych JS i CSS (forum)
- Ajaxed content nie dołącza potrzebnych JS i CSS (problem)
Myślę, że to nie jest problem, więc wypróbowałem to z innym podejściem i być może może to być rozwiązanie. Ładowanie całej strony PHP i wyodrębnianie określonego pliku div za pomocą ajax nie działało we właściwy sposób. Pomyślałem więc, że mogę pozwolić drupalowi na załadowanie tylko treści i wstrzyknięcie jej za pomocą ajax do div. Zrobiłem zapytanie za pomocą strony hook_preprocess_pode i hook_preprocess_node, która szuka „ajax = 1” w żądanym adresie URL, a następnie podaje zawartość tylko bez całej strony. A teraz, przy pomocy niektórych plików tpl.php, teoretycznie mógłbym ograniczyć wydajność drupala tylko do treści $. I tu jest problem. Moje podejście działa nawet wtedy, gdy zostawiam pliki tpl.php w oryginalny sposób, ale usuwam „$ content” z węzła-ajax.tpl.php. Przez „działanie we właściwy sposób” mam na myśli, że drupal nie przeładowuje całej strony, ale oczywiście nie treść. Ale nie mogę sobie tego wytłumaczyć, bo zmienna $ content, tak myślałem, to tylko HTML wygenerowanej treści. Moje pytanie brzmi: w jaki sposób mogę ograniczyć wydajność drupala do samej zawartości, czy też robię niewłaściwe kroki, aby to działało. Oto moduł i plik js, którego używam: my_ajax.module:
<?php
function my_ajax_init()
{
drupal_add_js(drupal_get_path('module', 'my_ajax') . '/my_ajax.js');
}
function my_ajax_preprocess_page(&$vars, $hook)
{
if (isset($_GET['ajax']) && $_GET['ajax'] == 1)
{
$vars['template_file'] = 'page-ajax';
}
}
function my_ajax_preprocess_node(&$vars, $hook)
{
if (isset($_GET['ajax']) && $_GET['ajax'] == 1)
{
$vars['template_file'] = 'node-ajax';
}
}
my_ajax.js:
Drupal.behaviors.my_ajax = function (context) {
$('#content-group-inner .node a').live('click', function (e) {
var url = $(this).attr('href');
//$('#content-region-inner').slideUp('slow');
$('#content-region-inner').empty().html('<img src="ajax-loader.gif" style="margin-left:50%;"/>');
xhr = $.ajax({
data: 'ajax=1',
type: 'GET',
url: url,
success: function (data) {
$('#content-region-inner').html(data);
Drupal.attachBehaviors(context);
}
});
return false;
});
};
Proszę, pomóż mi z tym. Każda sugestia jest doceniana.
źródło
Odpowiedzi:
Mam to. Działa to we właściwy sposób:
Dziękuję Ci za całą twoją pomoc.
źródło
context
(jak zauważył Josh Koenig) jest dużym nie-nie. Twój moduł obsługi zdarzeń zostanie ponownie dołączony do wszystkich elementów na stronie. Przy użyciucontext
ten kod musiałby zostać zmieniony, ponieważcontext
zawieradocument
on powiązanie pierwszego zdarzenia i sam element, kiedy treść zostanie zastąpiona, więc proste$('#content-group-inner a',context)
nie zadziała.Myślę, że Twoim problemem jest to, że funkcja sukcesu nie będzie miała zmiennego kontekstu w zakresie, więc zachowania dołączania będą działać na niezdefiniowane.
Domyślam się, że dasz radę
źródło
context
(która jest starym kontekstem zamiast nowego znacznika) w zasięgu: czy to źle?