Вопрос по работе с AJAX'ом

Главные вкладки

Аватар пользователя Catherine Catherine 31 июля 2011 в 18:07

Проблемы в аяксом, задача чтобы обновлялся текст по нажатию на кнопку, соответственно без перезагрузки страницы.
В моем модуле в хуке menu 'file' => 'user_clock.admin.inc', в котором

<?php return 
         
'<div id = "d1">' 'text'.  '</div>' .
    
'<form  id = "forma"> 
        <input type = "button" id = "obnovit" value = "ok">
        </form>'
?>

то есть на экране появляется некий текст и кнопка ok, далее я описываю -

<?php drupal_add_js(' $(document).ready(function(){
  $("#obnovit").click(function(){
    $.ajax({
            type: "GET",
            async: true,
            url: "1.php",
            success: function(msg){
                        $("#d1").html(msg);
                                  }
           });
           alert("kykykykyk");      
  });  
});'
);
?>

В фале 1.php формирую новый текст, который должен отобразиться после нажатия.
Смысл в том, что drupal_add_js вообще не выполняется, то есть алерт не срабатывает. Более того, если есть объявление формы, то есть то что я уже описала , то вся страница обновляется, а если ее не объявлять то вообще ничего не происходит. Может что-то нужно подключить или объявить, но просто как я понимаю, аякс уже есть в друпале. Помогите разобраться, пожалуйста!

Комментарии

Аватар пользователя Catherine Catherine 31 июля 2011 в 23:53

Я здесь новичок, как видно по моим вопросам, и я прошу чтобы мне здесь подсказали, я понимаю, что вы здесь профи друпала, подобные ссылки я уже читала, там хоть 10 или 15 отличий, ни горячо ни холодно, вопрос в том, что почему функции drupal_add_js() находящиеся на *.admin.inc не срабатывают?? Код не помещается в код страницы, а JS должен, чтобы работать. пишу банальные drupal_add_js(drupal_get_path('module', 'user_clock') . '/user_clock.js'); и

<?phpdrupal_add_js('$("#obnovit").click(function()
            {
            alert("lalalala!!") ;
            }
                  )'
             );
?>

естественно ничего!
Не могу понять почему так. Может где-то туплю, подскажите. Читаю, не могу ответить себе на свой вопрос!

Аватар пользователя Catherine Catherine 1 августа 2011 в 18:08

"xxandeadxx" wrote:
приведите нормальные листинги, какой код, в каком файле. по обрывкам ничего сказать нельзя

user_clock.module

<?php function user_clock_menu() {
  
$items['user/%user/user_clock'] = array(
    
'title' => 'user_clock',
    
'description' => "user_clock",
    
'page callback' => 'user_clock_func',
    
'page arguments' => array(1),
    
'access arguments' => array('access content'),
    
'file' => 'user_clock.admin.inc',
    
'type' => MENU_LOCAL_TASK,    
  );
  return 
$items;
}                   
?>

user_clock.admin.inc

<?php
function user_clock_func($r) {
  global 
$user;
  if ((
$user -> uid == $r -> uid) || ($user -> uid == 1)) { 
    return 
            
'<div id = "d1">' format_date(strtotime(date("M d Y H:i:s")), large) .  '</div>' .
    
'<form  id = "forma"> 
        <input type = "button" id = "obnovit" value = "ok">
        </form>'

  }
  elseif (!isset(
$r -> uid)) {   
    
drupal_not_found();          
  }                                                                         
  else {
     
drupal_access_denied();
  }
drupal_add_js(drupal_get_path('module''user_clock') . '/user_clock.js');
drupal_add_js('alert("qqq")');
}
?>

user_clock.js

<?php $.ajax({
                                             
type"GET",
                                             
asynctrue,
                                             
url"1.php",
                                             
success: function(msg)
                         {
                                                        $(
"#d1").html(msg);

                                             }
                                   });

?>

1.php
<?php format_date(strtotime(date("M d Y H:i:s")), large); ?>

Аватар пользователя Catherine Catherine 1 августа 2011 в 18:10

Уже пыталась с drupal_get_path. Но какой смысл если даже alert не срабатывает... (( Может что-то где-то надо объявить?!.. Я уже сама себя в тупик загнала.

Аватар пользователя xxandeadxx xxandeadxx 1 августа 2011 в 18:15

drupal_add_js надо вызывать ДО выхода из функции (до return).

инлайновые скрипты вставляются с передачей во втором аргументе строки 'inline'. вы бы это знали, если последовали совету в первом посте. http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_ad...

скрипты должны начинать работу после готовности dom. http://drupal.org/node/301181

Аватар пользователя Catherine Catherine 1 августа 2011 в 18:37

'inline' я пробовала, это уже от множества вариантов убрала, а вот про return - это для меня просвет)) так как уже алерт хотя бы срабатывает!

Аватар пользователя Drupal Coder Drupal Coder 6 августа 2011 в 1:23

drupal_add_js чтобы отработал:
- надо его до return вызывать :),
- в случае с alert или добавлением кода в верху топика добавить второй параметр 'inline'.

Содержимое файла user_clock.js неправильное. Нельзя там JS-код оборачивать в <?php ?>, ну это как бы вообще не то.

В user_clock.js нельзя сразу $.ajax() делать, надо дождаться пока весь документ загрузится и делать это на клик, $(document).ready(function(){}) как в начале топика, это правильная мысль (так на JQuery положено). Но в Drupal немного иначе принято:

Drupal.behaviors.myModuleBehavior = function (context) {
//do some fancy stuff
};

Подробности тут:
http://drupal.org/node/304258

Но на самом деле в данной конкретной задаче т.к. кнопка кроме JS-обработчика больше ничего не будет уметь делать, можно вообще проще сделать, не используя drupal_add_js, т.е. не добавляя JS-код в head. Можно прямо в теле меню колбека вместе с конпкой вернуть JS-код.

Тут есть минимум два варианта:
1. добавить в input атрибут onclick="мой JS-код",
2. добавить сразу после кнопки $("#obnovit").click(function(){}).