В моем приложении у меня есть представление, которое включает эту строку как часть таблицы:
<td>{{=A('Callback test', callback=URL('jquery_test'), target=':eval')}}</td>
jquery_test - это метод, который делает это:
def jquery_test():
return "jQuery('#option_list').html('Example jQuery string');"
Это работало в более ранней версии web2py: строка "Пример строки jQuery" была правильно введена в division view_list.
Сегодня утром, осознав, что я отставал от web2py, я повысил уровень до 2.9.5. Теперь приведенный выше код перенаправляет возвращаемую строку: я получаю пустое представление с помощью "jQuery (" # option_list "). Html (" Пример строки jQuery "); в теме. URL-адрес страницы
"http://127.0.0.1:8000/myApp/default/jquery_test"
Я не могу сказать, какое обновление изменило это поведение, поскольку я перешел от 2.2-something до 2.9.5. Какие идеи изменились и как их исправить?
Благодарю.
Отредактировано с дополнительной информацией... Я обновил файлы web2py.js (и другие.js и.css файлы), как это было предложено Энтони ниже.
Используя этот обратный вызов в файле вида:
<td>{{=A('Callback test', callback=URL('jquery_test'), target='options_list')}}</td>
правильно вызывает метод jquery_test и заполняет DIV id = 'options_list'
Использование этого обратного вызова:
<td>{{=A('Callback test', callback=URL('jquery_test'), target=':eval')}}</td>
не вызывает метод jquery_test. Он никогда не выполняется вообще.
Я надеюсь, что это дает дополнительные подсказки.
При обновлении фреймворка вам также необходимо обновить файл web2py.js в папке приложения /static
, поскольку это часть кода фреймворка и требуется, чтобы функциональность JavaScript/Ajax работала правильно.
ОБНОВЛЕНИЕ: глядя на старый и новый код, похоже, что реализация изменилась. Это правда, что target=':eval'
используется для работы (из-за реализации за кадром с использованием функции ajax()
), но это не было документированной функцией.
В качестве альтернативы вместо того, чтобы быть обработанным JavaScript-кодом Ajax, вы должны быть в состоянии добавить код JavaScript в response.js
, и он будет выполнен на клиенте.