2009-09-03 2 views
3

Javascript для меня довольно шаткий, и я не могу найти ответ на этот вопрос. У меня есть код в строкахИспользование 'this' внутри ссылки, сгенерированной объектом javascript

var Scheduler = function(divid,startDate,mode){ 

    this.setHeader = function(){ 
      header.innerHTML = '<a href="#" onclick="this.showScheduler(1);">Show</a>'; 

    } 

    this.showScheduler = function period(){ 

     ... 
    } 

};

Моя проблема заключается в том, как помещать onclick в HTML так, чтобы он правильно вызывал функцию showScheduler для соответствующего экземпляра текущего объекта планировщика, с которым я работаю?

ответ

1

Вы должны использовать фреймворк для этого типа вещей. Если вы не используете его, вы должны объявить каждый экземпляр расписания как глобального объекта, и вам понадобится имя экземпляра, чтобы вызвать его из ссылки. Посмотрите на следующую ссылку

http://developer.yahoo.com/yui/examples/event/eventsimple.html

Они показывают только функция применяется, но вы также можете сделать что-то вроде этого

YAHOO.util.Event.addListener(myAnchorDom, "click", this.showScheduler,this,true); 

Где myAnchorDom является объектом ахор тег дом. Это будет иметь функцию showScheduler в пределах области вашего объекта планировщика.

+2

Вам не нужна фреймворк для установки 'myAnchorElement.onclick = ...'. –

+1

Нет, но установка onclick напрямую - плохая идея и всегда была. Вот почему каждый, кто знает, что делает, использует пару add/attach. – annakata

+0

Вам не нужен один ... но зачем делать жизнь сложной для себя, занимаясь проблемами кросс-браузера. – Zoidberg

-1

При использовании «this» внутри атрибута onclick вы на самом деле ссылаетесь на объект тега привязки. Попробуйте это и посмотреть, если он работает:

this.setHeader = function(){ 
     header.innerHTML = '<a href="#" onclick="Scheduler.showScheduler(1);">Show</a>'; 
} 
+0

Это не сработает, если вы не используете Scheduler как статический объект. – Zoidberg

+0

Правда. Возможно, плохое предположение с моей стороны. –

0

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

var me = this; 

this.setHeader = function(){ 
      header.innerHTML = '<a href="#" onclick="this.showScheduler(1);">Show</a>'; 

header.addHandler("click", function(e) { me.showScheduler(1); }); 
    } 

Инсайт переданная функция, это будет относиться к элементу заголовка.

+1

Является ли функция addListener структурой? – Zoidberg

+0

Его ошибка с моей стороны. Я не уверен в точном имени, но его функция доступна без рамки, однако вызов для IE и FF отличается. – eulerfx

4

Я бы не делать то, что вы делаете, как вы делаете это, но с кодом, как вы есть, я хотел бы сделать это (много ofdo и делать :)):

var Scheduler = function(divid, startDate, mode){ 
    var that = this; 

    this.setHeader = function(){ 
      header.innerHTML = '<a href="#">Show</a>'; 
      header.firstChild.onclick = function() { that.showScheduler(1); }; 
    } 

    this.showScheduler = function period(){ 

     ... 
    } 
}; 
+1

. Меня удивляет отсутствие ясности вокруг школьных обработчиков событий и элементов DOM в ответах. далеко. Твой первый достал. –

+0

@crescentfresh - Мне нравится пинать старую школу;) – nickytonline

+0

Это не будет работать в Firefox. Только IE – Zoidberg

1

Вместо работы с innerHTML используйте методы DOM.

Попробуйте заменить это:

header.innerHTML = '<a href="#" onclick="this.showScheduler(1);">Show</a>'; 

с этим:

var x = this; // create a closure reference 
var anchor = document.createElement('a'); 
anchor.href= '#'; 
anchor.innerHTML = 'Show'; 
anchor.onclick = function() { x.showScheduler(1); }; //don't use onclick in real life, use some real event binding from a library 
header.appendChild(anchor); 

Объяснение:

"это" в исходном коде относится к элементу, который обожженного событие, т.е. anchor («это», как известно, проблематично для таких вещей, как, например, так). Решение заключается в создании замыкания на правильном методе (поэтому вы должны создать что-то вроде var xa bove), который затем оставляет проблему пропускания в параметре, который выполняется путем обертывания метода другой функцией.

Строго говоря, было бы предпочтительнее связывать обработчики событий с парой addEventListener/attachEvent (поскольку прямое назначение события исключает возможность назначить несколько обработчиков одному событию), но лучше всего использовать эту библиотеку, например, jquery, если вы новичок для JS в любом случае.

+0

Зачем «использовать некоторые реальные привязки событий из библиотеки»? –

+0

Потому что для новичков события - одна из самых сложных вещей, которые можно обернуть вокруг. Я бы настоятельно советовал использовать то, что просто работает, а не тратить время на правильное и/или изобретать колеса. – annakata

+0

@annakata: очень хорошая точка. Он также избегает этого: http://stackoverflow.com/questions/95731/why-does-an-onclick-property-set-with-setattribute-fail-to-work-in-ie –

0
var Scheduler = function(divid, startDate, mode) 
{ 
    var xthis = this; 

    this.setHeader = function() 
    { 
      var lnk = document.createElement("a"); 
      lnk.addEventListener("click", xthis.showScheduler, false); 
      lnk.innerText = "Show"; 
      lnk.setAttribute('href', "#"); 
      header.appendChild(lnk); 
    } 

    this.showScheduler = function period(){ 

     ... 
    } 
}; 
+1

'lnk.addEventListener' не будет работать в IE, а' lnk.innerText = 'будет * только * работать в IE. –

+0

ОК, это правильно. было бы лучше, как это делает @annakata –

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