2015-08-13 2 views
0

Простой html, подобный этому выше, открытый на Edge, отображает предупреждение.Microsoft Edge вызывает onload named function при загрузке страницы

<html> 
    <head> 
     <script> 
     var onload = function() { 
      alert('I\'ve been called'); 
     }; 
     </script> 
    </head> 
    <body> my body </body> 
</html> 

Более того, если добавить window.addEventListener('load', onload, false); в код, функция дозвонились дважды ..

У меня есть веб-приложение, и мои функции OnLoad называются дважды everypage ...

  1. Был ли способ отключить эту функцию , серверную сторону, поэтому функция будет вызываться только один раз, без необходимости реорганизовывать весь мой код?
  2. Является ли это известной ошибкой или поведением, которое нам нужно будет учитывать с этого момента?
+1

Я думаю, что 'var onload' фактически устанавливает' window.onload'. – Xufox

ответ

5

Вы назначаете функцию window.onload И вы устанавливаете прослушиватель событий в событие загрузки окна. Вы подключаете двух прослушивателей событий к одной и той же функции, чтобы ее вызывали дважды.

Помните, что глобальные переменные являются все свойства window объекта тоже так, когда вы делаете:

var onload = function() {...} 

в глобальном пространстве имен, который идентичен делать:

window.onload = function() {...} 

Который Настройка обработчик события.

Если вы не хотите эту проблему, измените имя своей функции onload на то, что не конфликтует с window.onload, или используйте анонимную функцию (это отличный пример того, почему вы должны использовать обработчик анонимного события по возможности и избегать использования глобального пространства имен по возможности).


Я хотел бы предложить либо это:

// anonymous function 
window.addEventListener('load', function() { 
    alert('I\'ve been called'); 
}, false); 

или это:

// use IIFE function to insulate from global namespace 
(function() { 
    var onload = function() { 
     alert('I\'ve been called'); 
    }; 
    window.addEventListener('load', onload, false); 
})(); 
+0

Я согласен с этим. Знаете ли вы, однако, почему тогда проблема не возникла бы в других браузерах, даже IE 11, 10 и т. Д.? – oldergod

+0

@oldergod - Я не знаю, почему это не произойдет в этих браузерах (мне кажется, что это будет). Код будет создавать проблемы настолько наилучшим образом, чтобы избежать неприятностей. Большие причины избегать глобальных функций или переменных, когда это возможно. – jfriend00

1

Там нет никакого способа, чтобы отключить эту функцию. Избегайте загрязнять глобальное пространство имен, как это, и просто оберните свою функцию в IIFE. Это также поможет в сборе мусора для других сценариев.

(function(){ 
    var onload = function() { 
     alert('I\'ve been called'); 
    }; 
    window.addEventListener('load', onload, false); 
})() 
2

Ничего не связано с краем microsoft. Это просто ES6, который реализован в краю и еще не в других браузерах. Это не ошибка, это особенность.

Таким образом, ваш код будет разбит на хром, firefox тоже в течение нескольких недель.
https://thechamplord.wordpress.com/2014/07/04/using-javascript-window-onload-event-properly/
https://msdn.microsoft.com/en-us/library/cc197055%28v=vs.85%29.aspx

Кроме того, почему бы вы дать функцию с таким именем?

+0

Я не мог найти источник, который бы связал это поведение с ES6. У вас есть? – oldergod

+0

да, 2 ссылки, которые я опубликовал –

Смежные вопросы