javascript onclick 事件的 'this' 范围
scope of 'this' for a javascript onclick event
我正在尝试使用 this
访问函数以获取 javascript onclick
事件。目前我只能使用 this
return dom 节点。是否可以将范围扩展到此 dom 节点之外?我想调用函数 toggleLayer
。使用道场 1.7+
toggleLayer: function(){
console.log('toggled layer!!!');
},
_init: function() {
this.domNode.innerHTML = 'Click <a href="#"onclick="this.toggleLayer()">Here</a> to toggle layer';
}
编辑 - 这是我从 Quentins 回答中得出的解决方案:
toggleLayer: function() {
console.log('toggled layer!!!');
},
_init: function() {
this.domNode.innerHTML = ''; // Erase existing content
this.domNode.appendChild(document.createTextNode('Click '));
var link = document.createElement('a');
link.appendChild(document.createTextNode('Here'));
link.href = "#";
link.addEventListener('click', this.toggleLayer.bind(this));
this.domNode.appendChild(link);
this.domNode.appendChild(document.createTextNode(' to toggle layer'));
}
在这种情况下不是。您通过创建一个字符串然后转换它来生成 DOM。您从字符串中创建的函数与您所在的范围完全没有关系。
请改用正确的 DOM。
this.domNode.innerHTML = ""; // Erase existing content
this.domNode.appendChild(document.createTextNode("Click "));
var button = document.createElement("button"); // Don't use links to the top fo the page for this
button.appendChild(document.createTextNode("Here"));
button.addEventListener("click", this.toggleLayer.bind(this));
this.domNode.appendChild(button);
this.domNode.appendChild(document.createTextNode(" to toggle layer"));
将上下文绑定到函数的 'Dojo way' 是通过使用 lang.hitch
:
hitch() returns a function that will execute a given function in a given context.
https://dojotoolkit.org/reference-guide/1.10/dojo/_base/lang.html#hitch
以下是纯 Dojo 的实现方式:
require([
'dojo/_base/lang',
'dojo/dom',
'dojo/dom-construct',
'dojo/on'
], function(
lang,
dom,
domConstruct,
on
) {
function onClick () {
console.log('Got clicked context: ', this)
}
var link = domConstruct.create('a', {
textContent: 'Click me!',
href: '#'
}, dom.byId('my-div'));
on(link, 'click', lang.hitch(this, onClick));
});
我正在尝试使用 this
访问函数以获取 javascript onclick
事件。目前我只能使用 this
return dom 节点。是否可以将范围扩展到此 dom 节点之外?我想调用函数 toggleLayer
。使用道场 1.7+
toggleLayer: function(){
console.log('toggled layer!!!');
},
_init: function() {
this.domNode.innerHTML = 'Click <a href="#"onclick="this.toggleLayer()">Here</a> to toggle layer';
}
编辑 - 这是我从 Quentins 回答中得出的解决方案:
toggleLayer: function() {
console.log('toggled layer!!!');
},
_init: function() {
this.domNode.innerHTML = ''; // Erase existing content
this.domNode.appendChild(document.createTextNode('Click '));
var link = document.createElement('a');
link.appendChild(document.createTextNode('Here'));
link.href = "#";
link.addEventListener('click', this.toggleLayer.bind(this));
this.domNode.appendChild(link);
this.domNode.appendChild(document.createTextNode(' to toggle layer'));
}
在这种情况下不是。您通过创建一个字符串然后转换它来生成 DOM。您从字符串中创建的函数与您所在的范围完全没有关系。
请改用正确的 DOM。
this.domNode.innerHTML = ""; // Erase existing content
this.domNode.appendChild(document.createTextNode("Click "));
var button = document.createElement("button"); // Don't use links to the top fo the page for this
button.appendChild(document.createTextNode("Here"));
button.addEventListener("click", this.toggleLayer.bind(this));
this.domNode.appendChild(button);
this.domNode.appendChild(document.createTextNode(" to toggle layer"));
将上下文绑定到函数的 'Dojo way' 是通过使用 lang.hitch
:
hitch() returns a function that will execute a given function in a given context.
https://dojotoolkit.org/reference-guide/1.10/dojo/_base/lang.html#hitch
以下是纯 Dojo 的实现方式:
require([
'dojo/_base/lang',
'dojo/dom',
'dojo/dom-construct',
'dojo/on'
], function(
lang,
dom,
domConstruct,
on
) {
function onClick () {
console.log('Got clicked context: ', this)
}
var link = domConstruct.create('a', {
textContent: 'Click me!',
href: '#'
}, dom.byId('my-div'));
on(link, 'click', lang.hitch(this, onClick));
});