1. Главная
  2. Блоги
  3. Блог Catherine

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

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

Проблемы в аяксом, задача чтобы обновлялся текст по нажатию на кнопку, соответственно без перезагрузки страницы.
В моем модуле в хуке 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",
async: true,
url: "1.php",
success: function(msg)
{
$(
"#d1").html(msg);

}
});

?>

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

Аватар пользователя 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

Аватар пользователя 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(){}).

Логотип drupal.ru

Содержимое сайта публикуется на условиях CreativeCommons Attribution-ShareAlike 3.0 или более поздней версии. Программные коды в тексте статей — на условиях GNU GPL v2 или более поздней версии.

Документация по совместной работе с репозиторием drupal.ru – https://docs.drupal.ru/code

Drupal – торговая марка Дриса Бёйтарта

12+

AltStyle によって変換されたページ (->オリジナル) /