Проблемы в аяксом, задача чтобы обновлялся текст по нажатию на кнопку, соответственно без перезагрузки страницы.
В моем модуле в хуке 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 вообще не выполняется, то есть алерт не срабатывает. Более того, если есть объявление формы, то есть то что я уже описала , то вся страница обновляется, а если ее не объявлять то вообще ничего не происходит. Может что-то нужно подключить или объявить, но просто как я понимаю, аякс уже есть в друпале. Помогите разобраться, пожалуйста!
Комментарии
http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_ad...
смотрим примеры и находим 10 отличий
Я здесь новичок, как видно по моим вопросам, и я прошу чтобы мне здесь подсказали, я понимаю, что вы здесь профи друпала, подобные ссылки я уже читала, там хоть 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!!") ;
}
)'
);
?>
естественно ничего!
Не могу понять почему так. Может где-то туплю, подскажите. Читаю, не могу ответить себе на свой вопрос!
приведите нормальные листинги, какой код, в каком файле. по обрывкам ничего сказать нельзя
http://lemon-computing.livejournal.com/1445.html - пример
http://www.drupal.ru/node/62330 - вот тут в конце мало мальски рабочий модуль
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); ?>
Уже пыталась с drupal_get_path. Но какой смысл если даже alert не срабатывает... (( Может что-то где-то надо объявить?!.. Я уже сама себя в тупик загнала.
drupal_add_js надо вызывать ДО выхода из функции (до return).
инлайновые скрипты вставляются с передачей во втором аргументе строки 'inline'. вы бы это знали, если последовали совету в первом посте. http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_ad...
скрипты должны начинать работу после готовности dom. http://drupal.org/node/301181
Спасибо за рекомендации, буду сейчас разбираться)
'inline' я пробовала, это уже от множества вариантов убрала, а вот про return - это для меня просвет)) так как уже алерт хотя бы срабатывает!
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(){}).