【问题标题】:Script causes IE6 to fallover with no error脚本导致 IE6 失败且没有错误
【发布时间】:2011-01-09 11:27:00
【问题描述】:

我讨厌 IE6,事实上我希望微软能强行推出一个补丁来杀死该死的东西。以下脚本在 IE > 6 & FF,WebKit(chrome etal) 中运行良好,没有问题;有什么想法吗?

(function getElementsByClass(searchClass) {
        node = document;
        tag = '*';
        var els = node.getElementsByTagName(tag);
        var elsLen = els.length;
        var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
        var count = 1;
        for (i = 0, j = 0; i < elsLen; i++) {
            if ( pattern.test(els[i].className) ) {
                    var re1='.*?';  // Non-greedy match on filler
                    var re2='(\\\'.*?\\\')';    // Single Quote String 1
                    var p = new RegExp(re1+re2,["i"]);
                    var m = p.exec(els[i].getAttribute("onclick"));
                    var popURL = "";
                    if (m != null)
                    {
                      var strng1=m[1];
                      popURL = strng1.replace(/'/g,'');
                    }

                    els[i].setAttribute("href", popURL + "?keepthis=true&tb_iframe=true&height=430&width=400");
                    els[i].setAttribute("class", "thickbox"); 
                    els[i].removeAttribute("onclick");
                    j++;
                    count++;
            }
        }
       // return count; Ignore the return
})("vtthickbox");

【问题讨论】:

  • 不是一个真正的答案,但你可以通过 jquery 轻松做到这一点
  • 啊哈,我知道,我们广泛使用 JQuery;图书馆不应该取代知道发生了什么;o)
  • 有充分的理由尽可能使用标准 dom...dante.dojotoolkit.org/taskspeed :o) JQuerys 不错,但抽象总是会执行得更慢

标签: javascript dom internet-explorer-6


【解决方案1】:

typeof els[i].getAttribute("onclick") 在我的 IE6 中返回 function,但是 FF,Opera 返回 string

我认为RegExp.exec 不能处理function 对象。

因此,typeof m[1] 变成了undefined,这导致popURL 也变成了undefined

【讨论】:

  • 啊应该测试一下类型,我认为IE8会像7一样返回适当的字符串值。崩溃浏览器似乎有点恶毒。
  • IE7 中 getAttribute 的问题归结为以下和 iFlag 等 tobielangel.com/2007/1/11/attribute-nightmare-in-ie
  • 有趣的是,最快的解决方法是只测试 即 var isIE6 = /msie|MSIE 6/.test(navigator.userAgent);一天……一天!
  • IE7 不会返回字符串值;这仅在 IE8 本机模式下得到修复。由于这个原因,您通常不应该在 HTML 文档上使用 getAttribute/setAttribute;使用像 el.href 这样的普通 DOM Level 1 HTML 属性更易读也更可靠。如果您确实必须获取事件处理程序的字符串值,您可以使用getAttributeNode('onclick').value 来完成,但肯定有比使用正则表达式破解一些 JavaScript 代码以在其中找到字符串更可怕的方法吗?
  • (当然,除非标记完全不在您的手中,这将是可悲的。)此外,您不需要在正则表达式标志周围使用[](幸运的是,数组被转换为字符串具有相同的值,但你不应该依赖它)。 PS。不要浏览器嗅探。查看用户代理会得到很多误报。必要时进行能力嗅探,但为此,您不需要。
【解决方案2】:

为什么不直接使用它呢:

function getElementsByClass(searchClass) {
 var classElements = new Array(),
     node = document,
     tag = '*',
     els = node.getElementsByTagName(tag),
     elsLen = els.length,
     pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)"),
     i,
     j;
 for (i = 0, j = 0; i < elsLen; i++) {
  if (pattern.test(els[i].className)) {
   classElements[j] = els[i];
   j++;
  };
 };
 return classElements;
};

然后将onclick 事件处理程序逻辑放在getElementsByClass() 函数之外。

【讨论】:

  • 我尝试了一些方法,但我会尝试一下,看看它是否更快谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多