Onload方法在连续重新加载到应用程序时多次调用自身(var image=new image(),javascript问题)

Onload方法在连续重新加载到应用程序时多次调用自身(var image=new image(),javascript问题),javascript,image,internet-explorer-8,internet-explorer-9,Javascript,Image,Internet Explorer 8,Internet Explorer 9,我不明白为什么onload方法(见下面的代码)在IE8和IE9浏览器中连续重载时多次调用自己 我猜,onload方法触发了多次,导致该图像在IE8、IE9中多次渲染(显示)。下面的js代码是我的前辈Front Ender编写的(他使用自己编写的js库处理所有.append(),anim(),…方法)。该代码在Firefox、Chrome中正常工作,但在使用IE8或IE9浏览器重新加载时,图像(html代码)呈现了不止一次 一些快速信息: waitingFor()-定期扫描dom以查找匹配的元素

我不明白为什么onload方法(见下面的代码)在IE8和IE9浏览器中连续重载时多次调用自己

我猜,onload方法触发了多次,导致该图像在IE8、IE9中多次渲染(显示)。下面的js代码是我的前辈Front Ender编写的(他使用自己编写的js库处理所有
.append()
anim()
,…方法)。该代码在Firefox、Chrome中正常工作,但在使用IE8或IE9浏览器重新加载时,
图像(html代码)
呈现了不止一次

一些快速信息:

  • waitingFor()
    -定期扫描dom以查找匹配的元素
  • mdiTog
    -出现多次的图像
工作原理:

div
属性
Class=“suggestions ContextSuggestions”
插入到
主体
元素中,并包含一个无序列表(
ul
li
ul
),如果单击图像(
mdiTog
),该列表将在不透明度
0
1
之间切换

以下是
Mditog
多次出现的图像,其外观是随机的:

waitingFor('.viewport.homePage',函数(){
var mdiTog=新图像();
mdiTog.onload=函数(){
变量$mdi=M$('.mdi'),
$contextMenu=M$($body.append(“”)),
$toggle=M$($mdi.append('
  • ), 可见=假, 主动=假; var hideCtx=函数(){ 如果(可见){ $contextMenu.anim(“”,{opacity:100},{opacity:0},250,函数(){ $contextMenu.css({display:'none'}); }); 可见=假; } }; $toggle.css({opacity:0,display:'inline block'}).anim('',{opacity:0},{opacity:100},1000).on('click',function(){ var togOS=$toggle.offset(), 菜单=“”; M$('li',$mdi.get())。每个(函数(el,idx){ 如果(idx>1){ menu+='
  • '+$mdi.text(null,el)+'
  • '; } }); $contextMenu.css({opacity:0,display'block',top:togOS.top+'px',left:(togOS.left-20)+'px'}).anim('',{opacity:0},{opacity:100},400,函数(){ 可见=真实; }).html(“
      ”+菜单+”
    • “+translate('previewAll')+”
    • ”+translate('closeAll')+”
    ); }); $contextMenu.on('click',函数(e){ var target=$contextMenu.eventTarget(e); if(target.tagName=='LI'&&target.className.indexOf('uiUtil')==-1){ $contextMenu.fire('click',M$('.mditabli').get(parseInt(target.getAttribute('rel'),10)); } hideCtx(); }).on('mouseleave',函数(){ 主动=假; }).on('mouseenter',函数(){ 主动=真; }); setInterval(函数(){ 如果(!活动&可见){ hideCtx(); } }, 1000); }; mdiTog.src='media/img/ico_16_context.png'; });

    我必须尽快解决此问题,因此,欢迎在此代码中提出任何建议/修改/添加内容,以强制onload仅在IE8/IE9浏览器中执行一次,即使是在多次连续重新加载时也是如此。

    如果onload触发两次,则应防止多次执行处理程序:

    var mdiTog = new Image();
    var hasFired = false;
    mdiTog.onload = function () {
       if (hasFired)
           return;
       hasFired = true;
    
       …
    };
    
    或者,如果您正在使用类似jQuery的库,可以尝试
    one
    事件绑定方法:

    var mdiTog = new Image();
    M$(mdiTog).one("load", function () {
        …
    });
    

    感谢编辑Wouter J,我下次提问时会记住这些事情,但是没有render(调用)方法-它应该出现在网页上/呈现在网页上,所以做了更改,因为这会让读者感到困惑。因此,
    onload
    有时会触发两次?请缩小这个问题的范围。另外,您正在使用jQuery吗?是的,您可以这样说,正如我使用开发人员工具检查的那样,图像和HTML代码出现了不止一次。此外,我没有使用jquery,这段代码是由我的高级开发人员编写的,他使用了手工编制的MkiScript-javascript库。谢谢你的建议,我想onload函数已经启动了不止一次了。?然而,所有这些
    M$
    功能似乎都像jQuery.yup一样工作,它相当于jQuery中的
    $
    ,甚至大多数函数都像jQuery一样工作,但Mkiscript是3kb的小型化,而且速度相当快……)感谢Bergi的回答,首先我将在周一实施,然后只接受答案:)