我有以下jQuery / Javascript代码段。此代码段旨在插入新的div
元素作为页面上已存在的DOM元素的子元素。 div
元素包含文本标签“myLabel”。当有人点击“myLabel”时,我希望它用两个参数调用myFunction
:一个JSON对象和一个DOMElement。
$(document).ready(function() {
// myDOMElement is a DOM object acquired by doing document.getElementById()
// myFunction is a Javascript function defined elsewhere
myJSONObject = {"Hello": "World"};
var newDiv = document.createElement('div');
newDiv.setAttribute("id", "myNewDivID");
newDiv.innerHTML = "<span id=\"mySpanID\" onclick=\"myFunction('" + myJSONObject +"', '" + myDOMElement + "');\">myLabel</span>";
});
单击“myLabel”时,此代码不起作用。
问题在于我将myJSONObject
和myDOMElement
传递给myFunction
的方式。
在myFunction
中,它们分别以字符串“[object Object]
”和“[object HTMLDivElement]
”打印出来。显然这是因为我在函数调用中插入括号内的单引号。但是如果我删除那些单引号,那么它就不起作用,因为onclick
的定义现在包含语法错误。
如何绕过此问题转义字符串或解析/解析,以便我可以操纵myDOMElement
中的myJSONObject
和myFunction
?
答案 0 :(得分:0)
你显然使用jQuery,所以使用它
$(document).ready(function() {
var myJSONObject = {"Hello": "World"};
var newDiv = $('<div />', {id : 'myNewDivID'}),
var span = $('<span />', {id : 'mySpanID', text : 'myLabel'});
span.on('click', function() {
// use myJSONObject and "this" here
});
$('#target_element').append( newDiv.append(span) );
});
答案 1 :(得分:0)
您可以动态附加点击处理程序,即:
function myFunction(jsonObject, element) {
console.log(jsonObject);
console.log(element);
}
$(document).ready(function() {
myJSONObject = {"Hello": "World"};
var newDiv = $('<div id="myNewDivID"/>');
var span = $('<span id="mySpanID">');
span.text('myLabel');
span.on('click', myFunction.bind(undefined, myJSONObject, 'this would be the element'));
newDiv.append(span);
});
调用myFunction.bind()
将返回一个新函数,其参数为myFunction
预设。 bind
的第一个参数是this
将被设置为什么,但是因为jQuery将(我认为)使用call
来调用事件处理程序,所以它并不重要。
如果您也想要访问该事件,可以在myFunction
添加另一个参数,即:
function myFunction(jsonObject, element, event) {
// Do things.
}
没有jQuery:
function myFunction(jsonObject, element) {
console.log(jsonObject);
console.log(element);
}
$(document).ready(function() {
myJSONObject = {"Hello": "World"};
var div = document.createElement('div');
div.setAttribute('id', 'myNewDivId');
var span = document.createElement('span');
span.setAttribute('id', 'mySpanId');
span.innerText = 'words'; // or textContent?
span.addEventListener('click', myFunction.bind(window, myJSONObject, 'this would be the element'));
div.appendChild(span);
});