私の開発環境と本番環境の両方で、IE 10は単純な$ .ajax呼び出しを介してPOSTデータを送信することを拒否しています。
私のスクリプトは次のようになります:
_d = 'testvar=something';
$.ajax({
data: d,
success: function(h){
console.log(h);
}
});
_
実際のajaxリクエストは通過していますが、投稿データはありません???
リクエストヘッダーは正常に見えます。
_Request POST /steps/~do HTTP/1.1
Accept */*
Content-Type application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With XMLHttpRequest
Referer http://localhost:8080/steps/
Accept-Language en-GB,en-AU;q=0.7,en;q=0.3
Accept-Encoding gzip, deflate
User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Host localhost:8080
Content-Length 0
DNT 1
Connection Keep-Alive
Cache-Control no-cache
_
しかし、リクエストの本文は空です! (私はF12開発バーのIEのネットワークタブを使用してリクエストをキャプチャしています)。 PHPスクリプトでは、print_r($_POST);
は空の配列を返します。
これはIE 7-9、chrome、FF、safariでは正常に機能しますが、IE10では機能しませんか?
何かを見逃したのか、IE 10はバグがあるのでしょうか?
[〜#〜]編集[〜#〜]
グローバルajax設定を次のように設定しました。
_$.ajaxSetup({
url: ROOT+'~do', // ROOT is either http://localhost/.../~do or http(s)://www.steps.org.au/~do depending on production or development environment
type: 'POST'
});
_
さらに編集
Windows 8 Pro 64ビットでIEバージョン10.0.9200.16384を使用
リクエストヘッダーの直接コピー/貼り付けは次のとおりです。
_Key Value
Accept */*
Accept-Encoding gzip, deflate
Accept-Language en-GB,en-AU;q=0.7,en;q=0.3
Cache-Control no-cache
Connection Keep-Alive
Content-Length 0
Content-Type application/x-www-form-urlencoded; charset=UTF-8
Cookie __utma=91949528.1947702769.1348201656.1353212510.1353237955.6; __utmz=91949528.1348201656.1.1.utmcsr=localhost|utmccn=(referral)|utmcmd=referral|utmcct=/coconutoil.org.au/; __utmb=91949528.2.10.1353237955; __utmc=91949528; cartID=8b3b2b9187cfb1aeabd071d6ec86bbbb; PHPSESSID=bl57l7fp0h37au7g0em7i3uv13
DNT 1
Host www.steps.org.au
Referer https://www.steps.org.au/
Request POST /~do HTTP/1.1
User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
X-Requested-With XMLHttpRequest
_
リクエストの本文は空です。
応答ヘッダー:
_Key Value
Response HTTP/1.1 200 OK
Server nginx/0.7.65
Date Sun, 18 Nov 2012 11:23:35 GMT
Content-Type text/html
Transfer-Encoding chunked
Connection close
X-Powered-By PHP/5.3.5-1ubuntu7.2ppa1~lucid
Expires Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma no-cache
_
イニシエータ
_Property Value
Stage Document Processing
Element XMLHttpRequest
Action Processing
Document ID 0
Frame ID 0
Frame URL https://www.steps.org.au/Shop/Health-Products/
_
問題を再現するページ(実際にはサイト全体):
編集済み
まだ使用することを除いてこれに対するマイクロソフトからの修正はありません
<meta http-equiv="x-ua-compatible" content="IE=9" >
上記のメタタグを追加することにより、IE10はJavaScriptをIE9互換モードで実行します。
古い答え。
作成したテストのサンプルコードを投稿しています。同じコードをコードに使用することもできます。
<html>
<head runat="server">
<script src="../Scripts/jquery-1.8.3.js"></script>
<script type="text/javascript">
var xmlHttp = null;
var XMLHTTPREQUEST_MS_PROGIDS = new Array(
"Msxml2.XMLHTTP.7.0",
"Msxml2.XMLHTTP.6.0",
"Msxml2.XMLHTTP.5.0",
"Msxml2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"
);
function makePOSTRequest(url, parameters) {
if (window.XMLHttpRequest != null) {
//xmlHttp = new window.XMLHttpRequest();
xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
} else if (window.ActiveXObject != null) {
// Must be IE, find the right ActiveXObject.
var success = false;
for (var i = 0; i < XMLHTTPREQUEST_MS_PROGIDS.length && !success; i++) {
alert(XMLHTTPREQUEST_MS_PROGIDS[i])
try {
xmlHttp = new ActiveXObject(XMLHTTPREQUEST_MS_PROGIDS[i]);
success = true;
} catch (ex) { }
}
} else {
alert("Your browser does not support AJAX.");
return xmlHttp;
}
xmlHttp.onreadystatechange = alertContents;
xmlHttp.open('POST', url, true);
xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
//xmlHttp.setRequestHeader('Content-type', 'application/json;');
xmlHttp.setRequestHeader('Content-Length', parameters.length);
xmlHttp.setRequestHeader('Accept', 'text/html,application/xhtml+xml')
//xmlHttp.setRequestHeader('Connection', "close");
xmlHttp.send(parameters);
}
function alertContents() {
// alert( this.status );
if (xmlHttp.readyState == 4) {
//alert( this.responseText );
if (xmlHttp.status == 200) {
var result = xmlHttp.responseText;
// document.getElementById('result').innerHTML = result;
// document.getElementById('submitbutton').disabled = false;
alert(result);
} else {
//alert( this.getAllResponseHeaders() );
alert("There was a problem with the request.");
}
}
}
</script>
</head>
<body>
<a href="javascript:makePOSTRequest('/api/jobs/GetSearchResult','jtStartIndex=0&jtPageSize=10&jtSorting=jobDescription ASC&jobDescription=')">Click me please</a>
GetJobDetail
<br/><br/>
Url: <input type="text" id="url" value="/api/jobs/GetSearchResult"/><br/>
parameters: <input type="text" id="parameters" value="jtStartIndex=0&jtPageSize=10&jtSorting=jobDescription ASC&jobDescription="/><br/>
submit : <input type="button" id="callMethod" value = "call" onclick="javascript: makePOSTRequest($('#url').val(), $('#parameters').val())"/>
</body>
</html>
申し訳ありませんが、あなたの問題を再現するための私のすべての試みは成功しませんでした。つまり、すべてのPOSTは with HTTP bodyであり、Ajaxリクエストは正しく機能していました。だから私はあなたが説明した問題を再現することができませんでした。 Internet Explorer 10、Windows 8 W64ですべてのテストを行いましたRTM現在のすべての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フラグメントで応答され、ボタンが緑色になります。
チャットにアイテムを追加している最中にそうするために、質問に投稿した別のコードが実行されます /。 shop.1352417874.js から次のコード(49〜74行目)が実行されます。
_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
コールバックを含める必要があります。n
オブジェクトのプロパティとなるglobal variable window
を定義しました。そのような変数の導入は、副作用と、ページに含めた他のJavaScriptコードとの競合のために非常に危険です。他のいくつかの場所では、 global window
オブジェクトの新しいプロパティを間接的に設定します。例えば common.1345011838.js で定義された global doErrors
関数のコードは次のようになります_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;
_
多くのglobal変数を短い名前で定義しています。それは非常に悪いスタイルです。それはあなたが含めた他のモジュールとの衝突に続くことができます。通常、関数の中で必要なほとんど変数を定義するだけで十分です。ほとんどの変数の宣言を$(document).ready(function(){/*.HERE.*/});
内に移動できます。
本当に global 変数を定義する必要がある場合は、 one を定義できます。これは、名前空間のようになり、他のすべての変数を properties のみのグローバルオブジェクト。これは標準的な方法です。このようにして、使用する異なるモジュール間で発生する可能性のある競合の数を減らすことができます。たとえば、次のようなものを使用できます
_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
}
_
同じ問題があります。つまり、10デスクトップバージョンのバグだと思います。 Windows 8 Pro 64ビットで実行されています。 xhr.sendメソッドがデータを渡していないようです。他のすべてのブラウザ、つまりメトロモードで10、またはデスクトップモードでie9標準に変更した場合は正常に動作します。
私も同じ問題に直面しました。以下の変更でうまくいきました。
<meta http-equiv="x-ua-compatible" content="IE=9" >
私のために働いた:)
<meta http-equiv="x-ua-compatible" content="IE=9">
を設定しても解決できなかった同じ問題に直面しましたが、応答ヘッダーX-UA-Compatible
をIE9
に設定することでこれを強制しました。これは、メタヘッダーが認識されないため、推奨される方法ですHTML5バリデータ。
J2EEアプリケーションの場合、これは次のフィルターで実現できます。
public class IECompatibilityFilter implements Filter {
private String compatibilityMode = "IE=10";
public IECompatibilityFilter() {
}
public String getCompatibilityMode() {
return compatibilityMode;
}
public void setCompatibilityMode(String compatibilityMode) {
this.compatibilityMode = compatibilityMode;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String mode = filterConfig.getInitParameter("compatibilityMode");
if (StringUtils.isNotBlank(mode)) {
this.compatibilityMode = StringUtils.trim(mode);
}
}
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
if (!response.isCommitted() && response instanceof HttpServletResponse) {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.addHeader("X-UA-Compatible", compatibilityMode);
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
web.xml
に登録します。
<filter>
<filter-name>ieCompatibilityFilter</filter-name>
<filter-class>com.foobar.web.filter.IECompatibilityFilter</filter-class>
<init-param>
<param-name>compatibilityMode</param-name>
<param-value>IE=9</param-value>
</init-param>
</filter>
クロスドメインhttpsリクエストを行うWindow 8の問題があるようです。クロスドメインサーバー(開発サーバー)の証明書が無効であるため、証明書の有効性と関係があるかどうかを確認できません。
このリンクは回避策ですが、bootstrapアプリケーション全体でIE10 +だけのためにGETリクエストを作成したいですか? http://jonnyreeves.co.uk/2013/making- xhr-request-to-https-domains-with-winjs /
私は似たようなものを持っています( ブラウザからAmazon S3への画像アップロードの問題 )。私の場合、xhrオブジェクトがpost-requestingのときにクラッシュすることを発見しました http:// some .server.comhttps://my.local.server.com:123/foo からxhr.open( "POST"、httpUrl、true)呼び出しでクラッシュします。
それはおそらくIE10のバグです(驚きです;))、Win7とWin8の両方でクラッシュしています。
これと同じ問題が発生しましたが、1つのリクエストだけで、多くのajaxリクエストを処理するWebアプリがあるということです。マークアップを確認してください。レイアウト用のテーブルの中にフォームがありました
<table>
<form></form>
</table>
逆に変更するだけです。フォーム>テーブル。