在javascript对象生成的链接中使用“this”

时间:2009-09-03 19:50:55

标签: javascript object yui

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函数?

6 个答案:

答案 0 :(得分:4)

我不会做你正在做的任何事情,但是按照你的方式使用代码,我会这样做(很多做和做:) :)

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 :(得分:1)

你应该使用这种类型的框架。如果您不使用,那么您必须将每个调度实例声明为全局对象,并且您需要实例的名称才能从链接中调用它。请看以下链接

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

他们只展示正在应用的功能,但你也可以做这样的事情

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

myAnchorDom是achor标签dom对象。这将使showScheduler函数在调度程序对象的范围内执行。

答案 2 :(得分:1)

使用DOM方法而不是使用innerHTML。

尝试替换它:

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);

说明:

原始代码中的“this”指的是触发事件的元素,即锚点(“这个”对于像这样的事情来说是众所周知的问题。)解决方案是在正确的情况下创建一个闭包方法(这就是为什么你必须创建像上面的var x那样的东西)然后只留下传递参数的问题,这是通过将方法包装在另一个函数中来完成的。

严格来说,将eventhandlers绑定到addEventListener / attachEvent对会更好(因为直接事件赋值会排除将多个处理程序分配给一个事件的能力)但如果你是新手,最好使用像jquery这样的库来处理它。无论如何,JS。

答案 3 :(得分: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); });
    }

现场传递函数,这将引用标题元素。

答案 4 :(得分: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(){

        ...
   }
};

答案 5 :(得分:-1)

在onclick属性中使用“this”时,实际上是指锚标记对象。试试这个,看它是否有效:

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