2009-09-21 872 views
8

¿Hay alguna razón por la cual el siguiente código no funciona en IE? Mientras que con FF y otros navegadores correctos divide la cadena por la expresión dada, en IE simplemente no funciona.JavaScript: split no funciona en IE?

var str = "abc<font id=\"something\">def</font>gh"; 
alert(str.split(/(\<.*?\>|.)/).length); 

Gracias.

+0

Quizás esta página es de uso: http://blog.stevenlevithan.com/archives/cross-browser-split – spender

+0

Me pregunto, son ese tipo de cosas idiota en IE son errores o características decidido por la gestión ? ¡Supongo que IE 8 es una mierda! – thedp

+0

ENGAÑO: Los errores para los programadores son características nuevas y emocionantes para los comerciales. – ATorras

Respuesta

0

Quizás debería usar el objeto RegExp como el segundo ejemplo de http://msdn.microsoft.com/en-us/library/h6e2eb7w%28VS.85%29.aspx.

Atentamente.

+0

No tiene nada que ver con eso. El problema es la existencia de una expresión regular, no la forma en que se pasa al método de división. – thedp

+0

Lamento no haber expresado bien; Solo quería señalar la forma en que se crea la expresión regular, no la expresión propiamente dicha. IIRC He reparado algunos problemas de expresiones regulares creando el objeto RegExp, en lugar de utilizar el formato /.../. – ATorras

2

puede agregar el siguiente código a su programa y funcionará.

var split; 
// Avoid running twice; that would break the `nativeSplit` reference 
split = split || function (undef) { 

var nativeSplit = String.prototype.split, 
    compliantExecNpcg = /()??/.exec("")[1] === undef, // NPCG: nonparticipating capturing group 
    self; 

self = function (str, separator, limit) { 
    // If `separator` is not a regex, use `nativeSplit` 
    if (Object.prototype.toString.call(separator) !== "[object RegExp]") { 
     return nativeSplit.call(str, separator, limit); 
    } 
    var output = [], 
     flags = (separator.ignoreCase ? "i" : "") + 
       (separator.multiline ? "m" : "") + 
       (separator.extended ? "x" : "") + // Proposed for ES6 
       (separator.sticky  ? "y" : ""), // Firefox 3+ 
     lastLastIndex = 0, 
     // Make `global` and avoid `lastIndex` issues by working with a copy 
     separator = new RegExp(separator.source, flags + "g"), 
     separator2, match, lastIndex, lastLength; 
    str += ""; // Type-convert 
    if (!compliantExecNpcg) { 
     // Doesn't need flags gy, but they don't hurt 
     separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags); 
    } 
    /* Values for `limit`, per the spec: 
    * If undefined: 4294967295 // Math.pow(2, 32) - 1 
    * If 0, Infinity, or NaN: 0 
    * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; 
    * If negative number: 4294967296 - Math.floor(Math.abs(limit)) 
    * If other: Type-convert, then use the above rules 
    */ 
    limit = limit === undef ? 
     -1 >>> 0 : // Math.pow(2, 32) - 1 
     limit >>> 0; // ToUint32(limit) 
    while (match = separator.exec(str)) { 
     // `separator.lastIndex` is not reliable cross-browser 
     lastIndex = match.index + match[0].length; 
     if (lastIndex > lastLastIndex) { 
      output.push(str.slice(lastLastIndex, match.index)); 
      // Fix browsers whose `exec` methods don't consistently return `undefined` for 
      // nonparticipating capturing groups 
      if (!compliantExecNpcg && match.length > 1) { 
       match[0].replace(separator2, function() { 
        for (var i = 1; i < arguments.length - 2; i++) { 
         if (arguments[i] === undef) { 
          match[i] = undef; 
         } 
        } 
       }); 
      } 
      if (match.length > 1 && match.index < str.length) { 
       Array.prototype.push.apply(output, match.slice(1)); 
      } 
      lastLength = match[0].length; 
      lastLastIndex = lastIndex; 
      if (output.length >= limit) { 
       break; 
      } 
     } 
     if (separator.lastIndex === match.index) { 
      separator.lastIndex++; // Avoid an infinite loop 
     } 
    } 
    if (lastLastIndex === str.length) { 
     if (lastLength || !separator.test("")) { 
      output.push(""); 
     } 
    } else { 
     output.push(str.slice(lastLastIndex)); 
    } 
    return output.length > limit ? output.slice(0, limit) : output; 
}; 

// For convenience 
String.prototype.split = function (separator, limit) { 
    return self(this, separator, limit); 
}; 

return self; 
}(); 
+0

Para referencia y más detalles, el código es de: http://blog.stevenlevithan.com/archives/cross-browser-split –