gpt4 book ai didi

javascript - Mootools事件导致IE7/IE8死循环

转载 作者:行者123 更新时间:2023-11-29 20:10:34 25 4
gpt4 key购买 nike

我很难让它在 IE7(和 IE8)中工作。它是一个非常复杂的脚本的一个非常减少的部分。所以请记住,方法和结构不能改变太多。

在 IE7 中,选择其中一种类型时出现无限循环。在 FF、Chrome 和 IE9 中它工作正常。它也适用于 IE7/IE8 中的 mootools 1.1 库,但自从我将其转换为 Mootools 1.4 后,我遇到了循环问题。

也许框架中的某种事件委托(delegate)发生了变化。我真的不知道。非常感谢任何帮助!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>eventz</title>
<script src="https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js" type="text/javascript"></script>

<script type="text/javascript">
var eventz = new Class({
options: {

},
initialize: function(options) {
this.setOptions(options);
this.setup();
this.jx = 0;

},
setup: function() {
this.makeEvents();
// ...
},

makeEvents : function() {
alert("init");

var finputs = $$('.trig');

finputs.removeEvents('change');
finputs.removeEvents('click');

finputs.each(function(r) {

$(r).addEvents({
'change': function(e) {
//e.preventDefault();
alert(r.name);

new Event(e).stop();
this.refresh(r); // this needs to stay as refresh calls some ajax stuff
}.bind(this)
});
}.bind(this));

// ...
},

// refresh is called from various methods
refresh : function(el) {

if(el) {
// count types checkboxes
var ob_checked = 0;
$$('.otypes').each(function(r) {
// uncheck all if clicked on "All"
if(el.id == 'typ-0') {
r.checked = false;
}
r.checked == true ? ob_checked++ : 0 ;
})

// check "All" if non selected
if(ob_checked == 0) {
$('typ-0').checked = true;
}
// uncheck "All" if some selected
if(el.id != 'typ-0' && ob_checked != 0) {
$('typ-0').checked = false;
}

// ajax call ...
}
}
});
eventz.implement(new Options);

window.addEvent('domready', function(){
c = new eventz();
});

</script>

</head>
<body>
<fieldset class="types">
<input type="checkbox" class="trig" name="otypes[]" value="0" id="typ-0" checked="checked">All
<input id="typ-14" value="14" name="otypes[]" type="checkbox" class="otypes trig">Type A
<input id="typ-17" value="17" name="otypes[]" type="checkbox" class="otypes trig">Type B
</fieldset>
</body>
</html>

最佳答案

基本上在 MooTools 1.4.4+ 中,更改事件已在 IE 中“标准化”:

跟踪初始提交和修复。

关于您的代码,需要进行一些更改:

  1. new Event(e).stop(); 必须重写为:e.stop();
  2. implements 方法现在是一个修改器键:Implements

整个事情可以简化很多。这是一个示例重构,针对性能进行了一些优化,逻辑更清晰。

http://jsfiddle.net/M2dFy/5/

类似于:

var eventz = new Class({
options: {

},

Implements: [Options],

initialize: function(options) {
this.setOptions(options);
this.setup();
this.jx = 0;

},
setup: function() {
this.makeEvents();
// ...
},

makeEvents: function() {
var finputs = $$('.trig');

finputs.removeEvents('change');
finputs.removeEvents('click');

var self = this;
this.type0 = $('typ-0');
this.otypes = $$('.otypes');
this.pause = false; // stop flag because of IE

finputs.each(function(r) {

r.addEvents({
click: function(e) {
this.pause || self.refresh(r); // this needs to stay as refresh calls some ajax stuff
}
});
});

// ...
},

// refresh is called from various methods
refresh: function(el) {
this.pause = true;
if (el !== this.type0) {
// count types checkboxes
this.type0.set('checked', !this.otypes.some(function(other) {
return !!other.get("checked");
}));



// ajax call ...
}
else {
this.otypes.set('checked', false);
}
this.pause = false;
}
});

现在,鉴于您的代码,当您更改 .checked 时,它将触发 propertychange,这将尝试使事件冒泡。

我建议通过 .set.get 方法更改对 checked 的所有访问,例如。 el.set('checked', true);/el.get('checked') - id 或任何其他属性的类似用法。

希望这足以让您走上正确的道路,如果您要在 jsfiddle 中使用最小的 DOM 构建一个这样的示例,我将很乐意再次查看它。

我这里没有 IE (mac),但我怀疑它可能会在单击非所有复选框时中断,因为这会触发。

我建议移动到点击事件,尽管这会使标签无效: http://jsfiddle.net/M2dFy/4/

关于javascript - Mootools事件导致IE7/IE8死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10182381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com