Извините, но все мои попытки воспроизвести ваши проблемы не увенчались успехом. Другими словами, все POST-сообщения были с телом HTTP, и запросы Ajax работали правильно. Поэтому я не мог воспроизвести проблему, которую вы описали. Я провел все тесты в Internet Explorer 10, Windows 8 W64 RTM Enterprise со всеми текущими обновлениями Windows.
Если я добавлю какой-то товар (например, первый) в чат на странице вы упомянули, что я вижу, что запрос POST будет создан со следующим заголовком:
Anforderung POST /~do HTTP/1.1
Accept */*
Content-Type application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With XMLHttpRequest
Referer https://www.steps.org.au/
Accept-Language de-DE,de;q=0.8,ru;q=0.7,en-US;q=0.5,en;q=0.3,ja;q=0.2
Accept-Encoding gzip, deflate
User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)
Host www.steps.org.au
Content-Length 81
DNT 1
Connection Keep-Alive
Cache-Control no-cache
Cookie __utmc=91949528; __utma=91949528.365135675.1353268932.1353268932.1353268932.1; __utmb=91949528.1.10.1353268932; __utmz=91949528.1353268932.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=ka4shsgkfvnvfdcath2klh9un0; cartID=4a90a72a379989f597276ca30c79c6f6
Можно видеть, что Content-Length
равно 81, а не 0. Тело
i=1211&q=1&token=00f5e9f5768d09ae67f2016ebcb62e99a0d75345&cmd=addToCart&sideBar=1
На запрос будет отправлен фрагмент HTML, а кнопка станет зеленой.
Точнее, при добавлении предмета в чат будет выполняться другой код, который вы указали в своем вопросе. Будет выполнен следующий код (строки 49-74) из shop.1352417874.js а>:
var n;
function inCart(i,t){
var a = $('#add'+i);
var q = t?1:$('#qty'+i).val();
setLoader(a,(t?60:0),0);
if(!t) a.addClass('loading').html('').attr('href','javascript:;');
// d = 'i='+i+'&q='+q+'&token='+TOKEN+'&cmd=addToCart&sideBar=1';
$.ajax({
data: {
i:i,
q:q,
token:TOKEN,
cmd:"addToCart",
sideBar: 1
},
success: function(h){
$('#sideCartContents').replaceWith(h);
mkButtons();
jsEnhance();
setLoader();
n=0;
if(!t) a.removeClass('loading').addClass('green').attr('href','Shop/Checkout.html').html('Checkout').parent().find('div.QTY').html('<strong>x'+q+'</strong> <span class="inC">in cart</span>');
flashCart();
}
});
}
В моем тесте значения локальных переменных i
и q
были 1211
и 1
.
Так что я не мог видеть никаких ошибок, которые вы описываете. Поэтому вам нужно отлаживать код в той среде, в которой он будет воспроизводиться. При тестировании я бы рекомендовал вам использовать неминимизированный код jQuery. Вы можете отладить код jQuery.ajax, чтобы локализовать проблему.
Тем не менее, у меня есть несколько дополнительных советов для вас:
- Прежде всего, вы должны включить обратный вызов
error
в вызов $.ajax
, а не только обратный вызов success
.
- Вам следует просмотреть код JavaScript, который вы используете. Например, в приведенном выше фрагменте кода вы определили глобальную переменную
n
, которая будет свойством глобального объекта window
. Введение таких переменных очень опасно из-за побочных эффектов и конфликтов с другими кодами JavaScript, которые вы включаете на страницу. В некоторых других местах новые свойства глобального window
объекта задаются косвенно. Например, код глобальной doErrors
функции, определенной в common. 1345011838.js выглядит следующим образом
function doErrors(e,d){
e=e.split(',');
for(i in e){
$((d?d+' ':'')+'[name="'+e[i]+'"]:visible').addClass('error');
}
errors();
}
В приведенном выше коде вы используете переменную i
без ее определения. Таким образом, вы устанавливаете (или используете) переменную window.i
на пути. Понятно, что использование цикла for-in
в случае массива не годится. Можно было бы переписать код эквивалентным кодом, например for(var i=0,l=e.length; i<l; i++) {...}
.
Кроме того, вы начинаете код common.1345011838.js
с
var w,r,i,p,t,l,c,z,e,m,b,k,u,s,CPH,TOKEN;
var z = new Array();
var ROOT;
которые определяют множество глобальных переменных с короткими именами. Это очень плохой стиль. Это может привести к конфликтам с другими модулями, которые вы включили. Обычно достаточно определить большинство переменных, которые вам нужны внутри какой-либо функции. Вы можете переместить объявление большинства переменных внутрь $(document).ready(function(){/*.HERE.*/});
.
Если вам действительно нужно определить некоторые глобальные переменные, вы можете определить одну, которая будет похожа на пространство имен, и все остальные переменные, которые вы можете определить как свойства. единственного глобального объекта. Это стандартная практика. Таким образом можно уменьшить количество возможных конфликтов между разными модулями, которые вы используете. Например, вы можете использовать что-то вроде
MYGLOBALCHATOBJECT = {
root: "/",
z: [],
};
...
// add new property
MYGLOBALCHATOBJECT.TOKEN = "some value";
Вы должны довериться, чтобы определить многие функции внутри контекста других функций. Таким образом, вы могли бы уменьшить необходимость определения многих глобальных переменных. Просто пример В приведенном выше коде inCart
используется переменная n
, определенная выше для функции inCart
. Переменная n
будет использоваться только внутри другой глобальной функции flashCart
, определенной непосредственно после inCart
. При этом функция flashCart
будет использоваться только внутри обратного вызова success
. Таким образом, вы можете переписать код так, чтобы вы определяли как n
, так и flashCart
внутри обратного вызова success
:
...
success: function (h) {
// define LOCAL variable n
var n = 0;
// define LOCAL function which can use outer variable n
function flashCart(){
if(n<3) {
setTimeout("flashCart()",120);
n=n+1;
}
$('#sideCartBox').toggleClass('highlighted');
}
$('#sideCartContents').replaceWith(h);
mkButtons();
jsEnhance();
setLoader();
if(!t) a.removeClass('loading').addClass('green').attr('href','Shop/Checkout.html').html('Checkout').parent().find('div.QTY').html('<strong>x'+q+'</strong> <span class="inC">in cart</span>');
flashCart(); // we use LOCAL function
}
Я бы порекомендовал вам дополнительно протестировать свой код в JSHint или JSLint.
person
Oleg
schedule
18.11.2012
type: "POST"
иurl: "~do"
в качестве дополнительной опции$.ajax
. Не могли бы вы включить все варианты, которые вы использовали? Если вы устанавливаете некоторые глобальные настройки дляajaxSetup
, вы также должны включить эти настройки. - person Oleg   schedule 16.11.2012i=1211&q=1&token=bc7b5a8fde2470d8a67f5fe61e89fd6ce23f0844&cmd=addToCart&sideBar=1
будут отправлены по URL-адресуhttps://www.steps.org.au/~do
.Content-Length
равно81
,Referer
=https://www.steps.org.au/
. Я использовал IE10 в Windows 8 (User-Agent
=Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)
). Нет проблем! Что отличается от вашего теста? Возможно, у вас есть смесь между HTTP и HTTPS? Но как? - person Oleg   schedule 18.11.2012