2012-08-09 16 views
19

Estoy trabajando en un código JavaScript que crea una máscara alfa de una imagen usando rutas integradas por Photoshop. El controlador de carga de una etiqueta IMG llamaría un clip (esto). La función carga el archivo fuente de la imagen y lo escanea. Aquí está la disposición:¿Cómo se leen los datos binarios en IE9?

function clip(img) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', img.src, true); 
    xhr.responseType = 'arraybuffer'; 
    xhr.target = img; 

    xhr.onload = function(e) { 
     var bytes = new Uint8Array(this.response); 
     var p = findPhotoshopSegment(bytes); 
     if(p) { 
      var paths = parse8BIMData(bytes, p); 

      /* ... replaces IMG with SVG tag ... */ 
     } 
    }; 
    xhr.send(); 
} 

Puede ver el código en acción en http://flaczki.net46.net/JPEG/SVG.html

Actualmente, sólo funciona en Firefox, Chrome y Safari. No funciona en IE9. El navegador es compatible con SVG pero no con Uint8Array. ¿Hay algún tipo de solución?

+0

Utilizar Google Chrome Frame en la página https://developers.google.com/chrome/chrome-frame/ –

+0

"No funciona en IE9" no es un mensaje de error, si desea jugar con el cuchillos afilados, entonces realmente necesita hacer parte del trabajo usted mismo. – symcbean

Respuesta

27

Tuve el mismo problema mientras jugaba con la biblioteca pdf.js, y la solución que encontré es la de hacer mi propia Uint8Array, a continuación se muestra el código que necesita. Todos los créditos va a notmasteryet @github y el código completo se puede encontrar aquí https://gist.github.com/1057924

(function() { 
    try { 
    var a = new Uint8Array(1); 
    return; //no need 
    } catch(e) { } 

    function subarray(start, end) { 
    return this.slice(start, end); 
    } 

    function set_(array, offset) { 
    if (arguments.length < 2) offset = 0; 
    for (var i = 0, n = array.length; i < n; ++i, ++offset) 
     this[offset] = array[i] & 0xFF; 
    } 

    // we need typed arrays 
    function TypedArray(arg1) { 
    var result; 
    if (typeof arg1 === "number") { 
     result = new Array(arg1); 
     for (var i = 0; i < arg1; ++i) 
     result[i] = 0; 
    } else 
     result = arg1.slice(0); 
    result.subarray = subarray; 
    result.buffer = result; 
    result.byteLength = result.length; 
    result.set = set_; 
    if (typeof arg1 === "object" && arg1.buffer) 
     result.buffer = arg1.buffer; 

    return result; 
    } 

    window.Uint8Array = TypedArray; 
    window.Uint32Array = TypedArray; 
    window.Int32Array = TypedArray; 
})(); 
+0

¡Excelente! Ahora mi código también funciona en IE. Esa fue una buena solución llave en mano. Gracias. – cleong

+0

@Milan Jaric Intenté usar tu código pero no puedo hacerlo funcionar. puedes mostrarme cómo usaría esto para reemplazar mi Uint8Array que no está funcionando en safari ... gracias ... aquí está mi código. var frequencyData = new Uint8Array (analyser.frequencyBinCount); aquí está mi pregunta: http://stackoverflow.com/questions/31629868/web-audio-analyser-not-working-in-safari – Sarah

+0

¿Podría proporcionar un error del registro de la consola Safari? Es difícil saber cuál es el problema porque no tengo IOS para probar tu código. –

6

Si usted quiere estar seguro de que usted consigue más amplia gama de compatibilidad, también se puede utilizar el archivo compatibility.js incluido en el PDF .js distribución en el directorio "web". Obtenga PDF.js de Mozilla Github, descomprima el archivo zip e incluya el archivo compatibility.js del directorio anterior. También hace que la biblioteca PDF.js funcione, p. IE9

+0

¿Tiene alguna idea sobre cómo usar PDF.js en Windows Phone? Tengo problemas terribles para acceder a XHR y me aparece "Acceso denegado". Todavía estoy investigando y jugando intentando diferentes caminos pero espero que puedas darme una idea de cómo usarlo con wp8.1 – Thierry

Cuestiones relacionadas