2009-09-21 15 views
8

क्या कोई कारण है कि कोड का निम्न भाग IE में काम नहीं करता है? जबकि एफएफ और अन्य सीन ब्राउजर के साथ यह स्ट्रिंग को दिए गए अभिव्यक्ति से विभाजित करता है, आईई में यह बस काम नहीं करता है।जावास्क्रिप्ट: विभाजन आईई में काम नहीं करता है?

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

धन्यवाद।

+0

शायद यह पेज उपयोग की है: http://blog.stevenlevithan.com/archives/cross-browser-split – spender

+0

मुझे आश्चर्य है, IE में मूर्खतापूर्ण सामान में से जो दयालु हैं कीड़े हैं या प्रबंधन द्वारा निर्णय लिया सुविधाओं ? मुझे लगता है कि आईई 8 भी बेकार है! – thedp

+0

जॉक ऑन: प्रोग्रामर के लिए बग विज्ञापनों के लिए नई और रोमांचक विशेषताएं हैं। – ATorras

उत्तर

0

शायद आपको http://msdn.microsoft.com/en-us/library/h6e2eb7w%28VS.85%29.aspx के दूसरे उदाहरण की तरह RegExp ऑब्जेक्ट का उपयोग करना चाहिए।

सम्मान।

+0

इसका इसके साथ कुछ लेना देना नहीं है। समस्या एक नियमित अभिव्यक्ति का अस्तित्व है, जिस तरह से यह विभाजन विधि को पारित नहीं किया जाता है। – thedp

+0

मुझे खेद है कि मैंने अच्छी तरह से व्यक्त नहीं किया; मैं बस regexp बनाया गया तरीका इंगित करना चाहता था, regexp अभिव्यक्ति स्वयं नहीं। आईआईआरसी मैंने/re.x/p प्रारूप का उपयोग करने के बजाय RegExp ऑब्जेक्ट बनाने में कुछ regexp समस्याओं को ठीक किया है। – ATorras

2

आप नीचे दिए गए कोड को प्रोग्राम में जोड़ सकते हैं और यह काम करेगा।

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

संदर्भ और अधिक जानकारी के लिए, कोड से है: http://blog.stevenlevithan.com/archives/cross-browser-split –

संबंधित मुद्दे