使用';这';在javascript对象生成的链接中
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
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(){
...
}
};