如果生成代码,如何将 DOM 元素和 JSON 对象传递给 JavaScript 函数?

Posted

技术标签:

【中文标题】如果生成代码,如何将 DOM 元素和 JSON 对象传递给 JavaScript 函数?【英文标题】:How to pass DOM element and JSON object to JavaScript function if the code is generated? 【发布时间】:2014-06-17 10:30:01 【问题描述】:

我有以下 jQuery/javascript 代码 sn-p。这个 sn-p 旨在插入一个新的 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”时,此代码不起作用。

问题在于我将myJSONObjectmyDOMElement 传递给myFunction 的方式。

myFunction 中,它们分别打印为字符串“[object Object]”和“[object HTMLDivElement]”。显然这是因为我在函数调用的括号内插入了单引号。但是如果我删除那些单引号,那么它就不起作用了,因为onclick 的定义现在包含语法错误。

如何围绕这个问题转义字符串或解析/反解析,以便我可以在myFunction 中操作myDOMElementmyJSONObject

【问题讨论】:

您可以尝试动态附加点击处理程序,并使用常规 JS 函数? 【参考方案1】:

你显然在使用 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) );
);

【讨论】:

【参考方案2】:

您可以动态附加点击处理程序,即:

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

【讨论】:

以上是关于如果生成代码,如何将 DOM 元素和 JSON 对象传递给 JavaScript 函数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 从 DOM 元素创建 json

实用代码片段将json数据绑定到html元素 (转)

如何理解vue的虚拟dom

Vue.js中如何操作DOM

如何使用 jQuery 销毁 DOM 元素?

如何为 DOM 元素生成唯一的 CSS 选择器?