#google-chrome #jquery #safari
#google-chrome #jquery #safari
Вопрос:
У меня проблема со следующим кодом, который не хочет работать в Chrome и Safari:
function updateBasket(data) {
if (data != '') {
$.each(data, function(k, v) {
if (jQuery.inArray(k, data.remove) == -1 amp;amp; $('.' k).length > 0) {
$('.' k).html(v);
}
});
}
}
$('.add_to_basket').live('click', function() {
var button = $(this);
var classes = $(this).attr("class");
var identity = $(this).attr("rel").split('_');
var url = '/basket/action/add/type/' identity[0] '/id/' identity[1];
$.ajax({
type: 'POST',
url: url,
data: ({ cls : classes }),
dataType: 'json',
success: function(data) {
if (!data.error) {
updateBasket(data);
button.replaceWith(data.button);
}
}
});
return false;
});
Триггер .add_to_basket срабатывает только при первом нажатии — после этого он ничего не делает.
Это отлично работает с Firefox и IEs, но по какой-то причине Chrome и Safari, похоже, это не нравится.
Вот ответ json, который приходит после первого нажатия:
{
"error": false,
"items": {
"27": {
"price": "120.00",
"qty": 1,
"discount": 0,
"vat": 0,
"price_vat": 120
}
},
"bundles": [],
"no_of_items": 1,
"sub_total": "amp;pound;120.00",
"vat_total": "amp;pound;0.00",
"total": "amp;pound;120.00",
"remove": ["remove", "error", "button", "items", "basket"],
"button": "<a href="#" class="button button_red add_to_basket" rel="item_27">Remove from the basket</a>"
}
и тот, который следует за вторым (возврат в исходное состояние):
{
"error": false,
"items": [],
"bundles": [],
"no_of_items": 0,
"sub_total": "amp;pound;0.00",
"vat_total": "amp;pound;0.00",
"total": "amp;pound;0.00",
"remove": ["remove", "error", "button", "items", "basket"],
"button": "<a href="#" class="button button_blue add_to_basket" rel="item_27">Add to the basket</a>"
}
Есть идеи, что я здесь делаю не так?
Чтобы сделать это еще сложнее — это происходит только с Chrome и Safari в Mac OSX 10.5 (Leopard) — но не в Snow Leopard — используя те же версии браузеров (Chrome 11.0.696.71)
Просто обновление — я провел несколько тестов, и, похоже, это проблема с СЕАНСАМИ. Это также не позволяет мне войти в систему — это означает, что сеанс не создается при использовании Chrome или Safari в Mac OS X 10.5.
Есть идеи?
Комментарии:
1. Какой URL отправляется в каждом случае? Можете ли вы использовать отладчик для просмотра всего запроса и ответа?
2. Каждый раз один и тот же URL-адрес — просто параметры в URL могут отличаться. Окно информации об отладке пустое.
3. Это пахнет неправильной отправкой чего-либо или проблемой с серверной частью. Очевидно, что вы получаете ответ. Итак, серверная часть делает что-то не так? Если вы скопируете / вставите URL из неудачного обращения в свою строку URL, получите ли вы то же самое обратно?
4. Я получаю точно такой же распечатанный массив json. Я думаю, что проблема может быть в индексе ‘button’, который отправляет элемент в формате html. Есть ли какие-либо известные проблемы с отправкой html обратно в виде json?
5. Извините — просто для пояснения — эти ответы получены при использовании Firefox, а не рассматриваемых браузеров.
Ответ №1:
Я создал простой тестовый набор в jsfiddle. Я не уверен, почему ваш пример работает в другом браузере, но он не должен, если вы не пропустили некоторый код из вопроса.
Вот рабочий пример, который работает в Chrome. http://jsfiddle.net/ZtTeg/2 /
Чтобы заставить это работать, мне пришлось добавить parse возвращенную html-кнопку в элемент jquery (кажется, что только тогда добавляется обработчик кликов)
var replacement = $(data.button)
button.replaceWith(replacement)
Тестировал это в Firefox и Chrome, и здесь это работает.
Надеюсь, это поможет.
Кроме того, вы говорите, что у вас возникли некоторые проблемы с серверной частью (СЕССИЕЙ). Я не могу вам с этим помочь, но при макете / эмуляции ответа, полученного в моем тестовом примере, все, кажется, работает так, как вы хотели. Удачи.
Комментарии:
1. Однако, похоже, что проблема действительно связана с сеансами, поскольку он не создает сеанс на сервере после нажатия кнопки. Я также пробовал форму входа — и я тоже не могу войти в систему — действительно странно — это первый раз, когда я сталкиваюсь с чем-то подобным.
Ответ №2:
Хорошо — я выяснил, что вызывало проблемы:
if (!isset($_SESSION)) {
session_start();
}
которое должно быть просто:
session_start();
поскольку он самостоятельно проверяет, установлен ли сеанс.
Спасибо всем за участие!