HTML5파일 업로드플러그인
를 할 때 겪은 기술적 문제 요약: fileupload-html5.js (PS: 회사에서는 seajs 프레임워크를 사용합니다.)
문제 목록
1. ajax는 진행 이벤트에 대한 업로드 진행 상황을 모니터링하지 않습니다.
2. XMLHttpRequest(XHR) 크로스 도메인
질문 및 답변
1. jQuery는 onprogress 이벤트에 대한 인터페이스를 제공하지 않으며 기본 XHR 개체는 다른 인터페이스에서 찾아야 합니다.
jQuery.ajax()는 jqXHR 객체를 반환합니다. jqXHR은 XHR(네이티브)을 모방하지만, jqXHR이 고유한 메소드(예: .promise())를 추가하더라도 XHR(예: .upload)을 구현하는 모든 메소드 및 속성을 모방하지는 않습니다. 따라서 jqXHR은 XHR의 상위 집합이 아닙니다. //다음은 jQ의 내부 소스 코드를 가로채는 것입니다. $.ajax()는 이 jqXHR(가짜 XMLHttpRequest)을 반환합니다.
// Fake xhr jqXHR = { readyState: 0,
옵션 매개변수 구성에서 XHR과 관련된 두 가지 속성을 찾았습니다.
- xhr: XMLHttpRequest 객체를 생성하기 위한 콜백.
xhr()의 반환 값은 jQ가 사용할 수 있도록 제공되는 XHR입니다. 즉, 이 XHR은 데이터를 보내는 데 사용됩니다. xhr을 통해
콜백 함수를 생성하여 이를 재정의하고 XHR도 반환할 수 있지만 여기에 onprogress 이벤트를 바인딩할 수 있습니다. //jQ 소스 코드
// Get a new xhrvar handle, i, xhr = s.xhr();//[回调]在这里,下面是open方法// Open the socket// Passing null username, generates a login popup on Opera (#2865)if ( s.username ) { xhr.open( s.type, s.url, s.async, s.username, s.password );} else { xhr.open( s.type, s.url, s.async );} 所以我们应该这样做: $.ajax({ //..... xhr: function() { var xhr = $.ajaxSettings.xhr(); //绑定上传进度的回调函数 xhr.upload.addEventListener('progress', progress, false); return xhr;//一定要返回,不然jQ没有XHR对象用了 }});
xhrFields 속성은 jQ가 내부적으로 생성한 XHR을 가리키며, xhrFields를 기반으로 XMLHttpRequest를 얻을 수 있습니다. xhrFields의 값은 json 객체만 될 수 있으므로 다음과 같은 방법으로는 얻을 수 없습니다.
//오류 예
$.ajax({ //...... xhrFields: { upload.onprogress: function() { //语法错误 } } });
$.ajax({ //...... xhrFields: { onsendstart: function() { //this是指向XHR this.upload.addEventListener('progress', progress, false); } } });
2. XMLHttpRequestⅡ(XHR)는 크로스 도메인을 지원하지만 백그라운드 권한이 필요합니다.
//백그라운드에서 헤더 확인을 보내야 합니다
if($_REQUEST['cros']) { header("Access-Control-Allow-Origin:请求的域名"); }
게시물 요청
이 발행될 수 있습니다. 따라서 post 요청에 매개변수를 넣으세요. 첫 번째 요청에는 cros 매개변수가 없습니다. 즉, 통과할 수 없습니다.
위 내용은 HTML5 파일 업로드 플러그인에서 발생하는 기술적 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!