2016-01-27 2 views
0

Я не могу использовать функцию прослушивателя событий самостоятельно и слушатель работать.Функция самоиспускания JavaScript на addEventListener

Следующий код выполняет функцию, но Слушатель события не работают:

window.addEventListener("resize", (function() { 
document.getElementById("divMenu").innerHTML = document.getElementById("divTop").offsetWidth 
})()) 

функция установит необходимый (динамический с самого начала) CSS стиля, необходимой для сайта форматирования. Функция «resize» ДОЛЖНА выполняться при загрузке. Возможно ли это сделать, или я должен создать отдельную функцию Self Invoking и вызвать ее на прослушивателе событий?

+2

Что цель использования функции самостоятельно вызывающую? – guest271314

+0

функция установит необходимый (динамический с самого начала) стиль CSS, необходимый для форматирования веб-сайта. Функция «resize» ДОЛЖНА выполняться при загрузке. – Dillinger

ответ

4

Когда вы немедленно вызываете функцию, ее возвращаемое значение помещается в свое место (window.addEventListener('resize', undefined)). Вместо этого определите свою функцию за пределами прослушивателя событий, затем добавьте ее и вызовите.

function onResize() { 
    document.getElementById('divMenu').innerHTML = document.getElementById("divTop").offsetWidth; 
} 
window.addEventListener('resize', onResize); 
onResize(); 

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

window.addEventListener('resize', (function onResize() { 
    document.getElementById('divMenu').innerHTML = document.getElementById("divTop").offsetWidth; 
    // Works because it returns a function 
    return onResize; 
})()); 
+0

А, хороший звонок - имеет смысл, почему вы хотите запустить функцию одновременно с назначением ее. –

+0

Итак, Майк, вы говорите, что у вас не могут быть функции Self Invoking для слушателей событий? Джеймс: Я редактировал свой вопрос, чтобы включить эту информацию. – Dillinger

+2

@Dillinger Вы можете, если функция самозапускания возвращает другую функцию или себя. Помните: функция всегда возвращает значение, и это значение будет эффективно «заменять» функцию при передаче в качестве аргумента. –

0

Ваш IIF возвращает неопределенный, но eventlistener должен быть функцией или ссылкой на функцию. Добавить возврат к вашему IIF или передать функции:

Anonymous функция:

window.addEventListener("resize", function() { 
    document.getElementById("divMenu").innerHTML = document.getElementById("divTop").offsetWidth 
})) 

IIF, который возвращает функцию

window.addEventListener("resize", (function() { 
return function(){ 
    document.getElementById("divMenu").innerHTML = document.getElementById("divTop").offsetWidth 
} 
})()) 

редактируется (вызвать задание при запуске):

window.addEventListener("resize", (function() { 
    function set_innerHtml(){ 
    document.getElementById("divMenu").innerHTML = document.getElementById("divTop").offsetWidth 
    } 
    set_innerHtml(); 
    return set_innerHtml; 
})()) 
+0

Ваш ответ кажется тем, что мне нужно, но он не работает при запуске, помещает предупреждение внутри функции возврата, которую вы увидите только при всплывании при изменении размера. – Dillinger

+0

Последний добавленный код может помочь вам –

0

По какой-то причине я наполнен ненавистью при виде своих собеседников. aka:

function imAFunctionNeedlesslyAssignedGlobally(){ 
    display.textContent = input.value; 
} 
button.addEventListener('click', imAFunctionNeedlesslyAssignedGlobally); 
imAFunctionNeedlesslyAssignedGlobally(); 

Это просто выглядит уродливым и страшным. Возможно, я немного придирчив, но, тем не менее, я просто ненавижу это и его товарищеские хакерские решения для решения этой проблемы. Поразмышляя об этом немного, я придумал это. И мой о, мой мой код выглядит намного лучше, чем результат.

Function.prototype.runAndReturnSelf = function(){ 
    this(...arguments); 
    return this; 
}; 

button.addEventListener('click', function(){ 
    display.textContent = input.value; 
}.runAndReturnSelf()); 

Плюсы:

  • Deliciously простой
  • Изысканно явно
  • Просто посмотрите на эту анонимную функцию! Идеальный обзор!
  • минус 2 строки кода на событие слушателя

Cons:

  • Ни одно, что я могу сразу думать о