8
votes

Comment faire fonctionner Détecter si XMLHTTTPEQUEST prend en charge le responsable = "ArrayBuffer"?

Je veux savoir si le navigateur prend en charge xmlhttprecest.responsonetype = "arraybuffer" . Le problème est que je ne peux pas tester à nouveau une prise en charge "générale" XHR2, puisque iOS 4.2 a une prise en charge partielle XHR2 qui comprend (c.-à-d.) xmlhttpeffestupload mais pas indemniste = "araybuffer" .


0 commentaires

6 Réponses :


0
votes

Avez-vous essayé quelque chose comme ça? xxx


modifier

Je pense que vous pourriez être coincé avec quelque chose de méchant comme celui-ci xxx


5 commentaires

Bonne idée! Cependant, je viens de remarquer que ce safari mobile sur iOS 4.2 a déjà un support XHR2 "partiel", quelles coutures pour inclure xmlhttpeffestupload mais non responsables = "arraybuffer". Je vais mettre à jour la question en conséquence.


Apparemment, aucune exception n'est tirée lorsque la responsabilité est définie la valeur non prise en charge.


Désolé, avez testé cela avec la console Google Chrome et cela a fonctionné. (Fonction isarraybuffersupported () {var xhr = nouveau xmlhttpequest (); xhr.open ('get', '/', vrai); essayez {xhr.responseType = "arraybuffer"; renvoyer vrai;} Catch (e) ;}}) ()> vrai (fonction isarraybuffersupporté () {var xhr = nouveau xmlhttpequest (); xhr.open ("get ', vrai); essayez {xhr.responsonetype =" badarg "; retournez vrai; } Catch (E) {Retour Faux;}}) ()> Faux


@Samgreenhalgh, car Google Chrome et Apple Safari utilisent un comportement non standard. W3 ici & ICI n'ondit nulle part où une exception doit / doit être lancée. Le comportement préféré suggère que si la chaîne n'a pas de sens pour votre navigateur, (plutôt que de jeter une exception désagréable, utilisez votre «cerveau» et) utiliser une approche de retombe du type de responsabilité disponible le plus proche. Chrome / Safari a fourni ce comportement avant que les recommandations ne soient même publiés (pour clignoter le score élevé sur les points de repère?).


C'est exactement ce qu'ils ont fait avec une propriété gradient. Au moment où W3 a annoncé les recommandations, la mise en œuvre existante en chrome / safari est annulée. Mais au moins la propriété CSS provisoire a été préfixée par -webkit. Mais en cas de responsabilité, en théorie, l'affectation doit être ignorée par d'autres navigateurs, mais en pratique Chrome / Safari, faites une exception. Vous pouvez défendre contre cela à l'aide d'une instruction TRY / CATCH, comme dans l'exemple décrit ICI .



2
votes

Vérification de Arraybuffer code> doit être une bonne détection de fonctionnalité.

Si un utilisateur prend en charge l'objet arraybuffer code>, il fonctionne probablement avec XHR2 P> Cependant, comme indiqué, il serait préférable de faire un test de fonctionnalité et non d'une détection de fonctionnalité. P>

function IsArrayBufferSupported(cb){
    var xhr = new XMLHttpRequest();
    xhr.open('GET', '/', true);
    try {
       xhr.responseType = "arraybuffer";
    } catch (e){
        return cb(false);
    }
    xhr.onload = function onload() {
        if (ArrayBuffer.prototype.isPrototypeOf(this.response)) {
            return cb(true);
        }
        cb(false);
    }
    xhr.send();
}


2 commentaires

Apparemment, aucune exception n'est tirée lorsque la responsabilité est définie la valeur non prise en charge.


@Aronwoost Je m'attendrais à ce qu'aucune exception ne soit tirée, d'où la vérification du type de retour. Toutefois, pour le code de l'épreuve futur, il est de la valeur d'utilisation essayer au cas où tout autre useragent jette une exception



10
votes

J'utilise les éléments suivants:

var supported = typeof new XMLHttpRequest().responseType === 'string';


1 commentaires

Cela semble un bon test. Pour Android 2.3, je reçois "indéfini", pour Android 4.x, je reçois "String". Qui correspond bien avec caniuse.com/xhr2 (comme iOS 4.2, Android 2.3 semble avoir un support XMLHTTPeQuStupload ou à moins typeof (xmlhttpeffestupload) retourne "fonction", pas "non défini")



1
votes

SET NéesType code> à "ArrayBuffer" code> et vérifiez s'il a la nouvelle valeur:

// call like isResponseTypeSupported('arraybuffer')
function isResponseTypeSupported(responseType) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', '/');
    try {
        xhr.responseType = responseType;
    } catch (e) {
        return false;
    }
    return xhr.responseType === responseType;
}


1 commentaires

Il échoue pour IE6 depuis que vous ne vérifiez pas si responsables est pris en charge.




0
votes

Si vous souhaitez simplement détecter si la réponse "ArrayBuffer" CODE> est prise en charge, vérifiez simplement si c'est dans l'objet global. Si vous souhaitez détecter d'autres fonctionnalités, attribuez simplement le xhr (). NéesType code> jusqu'à ce que le navigateur videz-le "" code> ou jette une erreur.

function isAjaxResponseSupported(type) {
    var xhr = new XMLHttpRequest;

    /* Check if .responseType is supported first */
    if (typeof xhr.responseType === 'string') {

        /* Some browsers throw error for invalid .responseType */
        try {
            xhr.responseType = type;
            // If they don't,
            // check if .responseType is equal to @type.
            return xhr.responseType === type;
        } catch (e) {
            return false;
        }

    ; else return false;        
}


0 commentaires