Как сделать автоматический вызов функции javascript из функции php? - PullRequest
2 голосов
/ 09 февраля 2010

Я пытаюсь создать автообновление для таблицы, используя ajax / jquery, php / html и Drupal 6.

Код после того, как вставка базы данных завершилась и прошла успешно:

echo "<script type='text/javascript'>autoRefresh()</script>";

Код для ссылки, которая в конечном итоге вызывает код JavaScript, который фактически выполняет обновление таблицы:

    $block_content .= "<br><a id='refreshItemId' class='refreshItemLink' href='$host_url/refresh/projectitems/gid/$curr_gid/nid/$curr_nid'>Refresh List</a>";

Javascript-код, который добавляется на страницу с использованием PHP (я знаю, что это может быть файл javascript, а затем включить его, но это на другой день). Это код, который я добавил, чтобы попытаться автоматически щелкнуть () созданную выше ссылку после отправки формы и успешного добавления элемента в базу данных:

    $block_content .= "<script type='text/javascript'>
        function autoRefresh()
        {
            alert('Auto Refresh');
            //document.getElementById('refreshItemId').click();
        }
    </script>";

Я думал, что это сработало бы, но JS-функция autoRefresh () никогда не вызывается. Есть идеи?

Ответы [ 4 ]

1 голос
/ 09 февраля 2010

Вам нужно обернуть вызов AutoRefresh в обработчик события onload. Прямо сейчас функция запускается (или пытается запустить), как только она выводится в браузер, поэтому в этой точке нет кнопки для нажатия.

В jquery:

<script type="text/javascrpt">
    $(function() {
        autoRefresh();
   });
</script>

Обновление:

Если вы хотите, чтобы кнопка обновления была нажата после того, как пользователь внес изменения через AJAX, сделайте что-то вроде:

$.ajax({
  data: //data sent to script;
  url: //path to PHP script
  success: autoRefresh();
  }
});

Если вы хотите, чтобы он обновлялся только тогда, когда PHP-скрипт отправляет какое-то «безопасное слово», измените функцию успеха на что-то, что просматривает ответ сервера, а если это сигнал «все очищено», тогда выполняется автообновление.

Обновление 2:

Хорошо, после того, как вы все это угадали, вам нужен собственный обработчик событий, связанный с функцией. Итак, пусть PHP выведет следующий скрипт jquery:

 <script type="text/javascript">

 $(function() {
     $("#refreshItemId").click(function() {
     $(this).delay('200');
     autoRefresh();
     });
 });

Пара заметок:

Метод задержки является новым для jquery 1.4. Если у вас более старая версия, существуют другие методы, которые можно использовать для остановки функции.

У меня еще не было шансов возиться с .delay(), так что, возможно, я немного испортился.

Но общая идея должна быть ясной: привязать функцию к ссылке при загрузке страницы; Когда событие onclick запускает функцию, она ждет 0,2 секунды, пока завершится работа Ajax Drupal; наконец, он запускает функцию автообновления.

0 голосов
/ 09 февраля 2010

EDIT! Перечитав всю ветку с Энтони:

Пара вещей:

  • Посмотрите, можете ли вы добавить "eval ()" в ответ.

    echo "<script type='text/javascript'>eval('autoRefresh()');</script>";

  • Попробуйте поместить эту функцию autoRefresh () в глобальный JS-файл включения, вызываемый в теге head.

Другой альтернативой может быть перезапись функций, уже имеющихся в вашей библиотеке drupal, чтобы вы могли добавлять те вещи, которые хотите делать, в вызов Ajax.

0 голосов
/ 09 февраля 2010

Если вы обновляете содержимое страницы, используя innerHTML или аналогичный, код не будет выполняться при добавлении в DOM. Умное использование eval() может исправить это, хотя и может открыть вас для потенциальных уязвимостей XSS. Самый безопасный путь - это уже иметь функцию, определенную на странице, и затем вызывать ее, когда XHR успешно вернется.

0 голосов
/ 09 февраля 2010

Вам нужно отправить определение функции перед вызовом.

Пользовательский агент (браузер) в противном случае пытается вызвать функцию, которая еще не существует, что приводит к ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...