使用';这';在javascript对象生成的链接中

使用';这';在javascript对象生成的链接中,javascript,object,yui,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 = fu

Javascript对我来说非常不稳定,我似乎找不到答案。我有一些关于

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

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

    }

   this.showScheduler = function period(){

        ...
   }
var调度器=函数(divid、startDate、mode){
this.setHeader=函数(){
header.innerHTML='';
}
this.showScheduler=函数周期(){
...
}
})

我的问题是,如何将onclick放入HTML中,以便它为我正在使用的当前调度程序对象的适当实例正确调用showScheduler函数?

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

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

您可以直接向header对象添加事件处理程序:

var me = this;

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

header.addHandler("click", function(e) { me.showScheduler(1); });
    }
var me=this;
this.setHeader=函数(){
header.innerHTML='';
addHandler(“单击”,函数(e){me.showScheduler(1);});
}

在输入传递的函数时,这将引用header元素。

您应该为此类内容使用框架。如果不使用schedular,则必须将schedular的每个实例声明为全局对象,并且需要该实例的名称才能从链接调用它。请看下面的链接

它们只显示正在应用的函数,但您也可以执行类似的操作

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

其中myAnchorDom是achor标记dom对象。这将使showScheduler函数在您的scheduler对象的范围内执行。

我不会按照您的方式执行任何操作,但按照您的方式使用代码,我会这样做(大量的工作和工作:):

var调度器=函数(divid、startDate、mode){
var=这个;
this.setHeader=函数(){
header.innerHTML='';
header.firstChild.onclick=function(){that.showScheduler(1);};
}
this.showScheduler=函数周期(){
...
}
};

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

尝试替换此:

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

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


严格来说,最好将EventHandler与addEventListener/attachEvent对绑定(因为直接事件分配排除了将多个处理程序分配给一个事件的能力)但是,如果你是JS新手,最好使用jquery之类的库来处理它。

这是我的一个错误。我不确定确切的名称,但它是一个没有框架的函数,但是IE和FF的调用是不同的。我很惊讶,到目前为止,答案中关于ol'school事件处理程序和DOM元素的描述不够清晰。你的是第一个得到它的。@Zoidberg:它在Firefox中工作得很好。实际上它在1998年以来的所有浏览器中都能工作。@Zoidberg-如果您将onclick属性设置为yes,但不设置onclick属性,那么它们是两个不同的东西。header.firstChild.onclick=function(){that.showScheduler(1);};与header.firstChild.setAttribute(“onclick”,“function(){that.showScheduler(1);};”)不同;@Zoidberg:您考虑的是
setAttribute
和事件处理程序(您是对的,在所有IE中都会失败)。请参阅。但是,
onclick
属性将
函数
对象作为其值,并在所有浏览器中都有效。See@Zoidberg:
that
不是一个全局变量。nickyt只是使用闭包来捕获
调度程序的实例。这是一个众所周知的JavaScript习惯用法。对我来说,这可能是一个糟糕的假设。你不需要框架来设置
myanchoreElement.onclick=…
。不需要,但是直接设置onclick是一个坏主意,而且一直都是。这就是为什么每个知道自己在做什么的人都会使用添加/附加对。你不需要添加/附加对……但是为什么要让自己在处理跨浏览器问题时遇到困难。这实际上可能对你最有用因为我在脚本的其他地方使用了YUI。我要先玩一下,看看我是否能让它正常工作。谢谢。@Amy:你应该用你正在使用的任何框架来标记你的问题。这样答案就不必像你目前得到的答案那样差异很大。为什么“使用库中的真实事件绑定?”“?因为对于新手来说,活动是最难让你思考的事情之一。我强烈建议你使用一些能正常工作的东西,而不是花时间把它修好和/或重新发明轮子。@annakata:很好。它还避免了这一点:很好,但是setAttribute是有毒的:)
lnk.addEventListener
在IE中不起作用,而
lnk.innerText=
只在IE中起作用。
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(){

        ...
   }
};
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);
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(){

        ...
   }
};